@jsenv/core 30.3.7 → 30.3.9

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.
@@ -0,0 +1,392 @@
1
+ Object.defineProperty(exports, "__esModule", {
2
+ value: true
3
+ });
4
+ exports.default = void 0;
5
+ exports.getExportSpecifierName = getExportSpecifierName;
6
+ var _helperPluginUtils = require("@babel/helper-plugin-utils");
7
+ var _helperHoistVariables = require("@babel/helper-hoist-variables");
8
+ var _core = require("@babel/core");
9
+ var _helperModuleTransforms = require("@babel/helper-module-transforms");
10
+ var _helperValidatorIdentifier = require("@babel/helper-validator-identifier");
11
+ const buildTemplate = _core.template.statement(`
12
+ SYSTEM_REGISTER(MODULE_NAME, SOURCES, function (EXPORT_IDENTIFIER, CONTEXT_IDENTIFIER) {
13
+ "use strict";
14
+ BEFORE_BODY;
15
+ return {
16
+ setters: SETTERS,
17
+ execute: EXECUTE,
18
+ };
19
+ });
20
+ `);
21
+ const buildExportAll = _core.template.statement(`
22
+ for (var KEY in TARGET) {
23
+ if (KEY !== "default" && KEY !== "__esModule") EXPORT_OBJ[KEY] = TARGET[KEY];
24
+ }
25
+ `);
26
+ const MISSING_PLUGIN_WARNING = `\
27
+ WARNING: Dynamic import() transformation must be enabled using the
28
+ @babel/plugin-proposal-dynamic-import plugin. Babel 8 will
29
+ no longer transform import() without using that plugin.
30
+ `;
31
+ function getExportSpecifierName(node, stringSpecifiers) {
32
+ if (node.type === "Identifier") {
33
+ return node.name;
34
+ } else if (node.type === "StringLiteral") {
35
+ const stringValue = node.value;
36
+ if (!(0, _helperValidatorIdentifier.isIdentifierName)(stringValue)) {
37
+ stringSpecifiers.add(stringValue);
38
+ }
39
+ return stringValue;
40
+ } else {
41
+ throw new Error(`Expected export specifier to be either Identifier or StringLiteral, got ${node.type}`);
42
+ }
43
+ }
44
+ function constructExportCall(path, exportIdent, exportNames, exportValues, exportStarTarget, stringSpecifiers) {
45
+ const statements = [];
46
+ if (!exportStarTarget) {
47
+ if (exportNames.length === 1) {
48
+ statements.push(_core.types.expressionStatement(_core.types.callExpression(exportIdent, [_core.types.stringLiteral(exportNames[0]), exportValues[0]])));
49
+ } else {
50
+ const objectProperties = [];
51
+ for (let i = 0; i < exportNames.length; i++) {
52
+ const exportName = exportNames[i];
53
+ const exportValue = exportValues[i];
54
+ objectProperties.push(_core.types.objectProperty(stringSpecifiers.has(exportName) ? _core.types.stringLiteral(exportName) : _core.types.identifier(exportName), exportValue));
55
+ }
56
+ statements.push(_core.types.expressionStatement(_core.types.callExpression(exportIdent, [_core.types.objectExpression(objectProperties)])));
57
+ }
58
+ } else {
59
+ const exportObj = path.scope.generateUid("exportObj");
60
+ statements.push(_core.types.variableDeclaration("var", [_core.types.variableDeclarator(_core.types.identifier(exportObj), _core.types.objectExpression([]))]));
61
+ statements.push(buildExportAll({
62
+ KEY: path.scope.generateUidIdentifier("key"),
63
+ EXPORT_OBJ: _core.types.identifier(exportObj),
64
+ TARGET: exportStarTarget
65
+ }));
66
+ for (let i = 0; i < exportNames.length; i++) {
67
+ const exportName = exportNames[i];
68
+ const exportValue = exportValues[i];
69
+ statements.push(_core.types.expressionStatement(_core.types.assignmentExpression("=", _core.types.memberExpression(_core.types.identifier(exportObj), _core.types.identifier(exportName)), exportValue)));
70
+ }
71
+ statements.push(_core.types.expressionStatement(_core.types.callExpression(exportIdent, [_core.types.identifier(exportObj)])));
72
+ }
73
+ return statements;
74
+ }
75
+ var _default = (0, _helperPluginUtils.declare)((api, options) => {
76
+ api.assertVersion(7);
77
+ const {
78
+ systemGlobal = "System",
79
+ allowTopLevelThis = false
80
+ } = options;
81
+ const reassignmentVisited = new WeakSet();
82
+ const reassignmentVisitor = {
83
+ "AssignmentExpression|UpdateExpression"(path) {
84
+ if (reassignmentVisited.has(path.node)) return;
85
+ reassignmentVisited.add(path.node);
86
+ const arg = path.isAssignmentExpression() ? path.get("left") : path.get("argument");
87
+ if (arg.isObjectPattern() || arg.isArrayPattern()) {
88
+ const exprs = [path.node];
89
+ for (const name of Object.keys(arg.getBindingIdentifiers())) {
90
+ if (this.scope.getBinding(name) !== path.scope.getBinding(name)) {
91
+ return;
92
+ }
93
+ const exportedNames = this.exports[name];
94
+ if (!exportedNames) continue;
95
+ for (const exportedName of exportedNames) {
96
+ exprs.push(this.buildCall(exportedName, _core.types.identifier(name)).expression);
97
+ }
98
+ }
99
+ path.replaceWith(_core.types.sequenceExpression(exprs));
100
+ return;
101
+ }
102
+ if (!arg.isIdentifier()) return;
103
+ const name = arg.node.name;
104
+ if (this.scope.getBinding(name) !== path.scope.getBinding(name)) return;
105
+ const exportedNames = this.exports[name];
106
+ if (!exportedNames) return;
107
+ let node = path.node;
108
+ const isPostUpdateExpression = _core.types.isUpdateExpression(node, {
109
+ prefix: false
110
+ });
111
+ if (isPostUpdateExpression) {
112
+ node = _core.types.binaryExpression(node.operator[0], _core.types.unaryExpression("+", _core.types.cloneNode(node.argument)), _core.types.numericLiteral(1));
113
+ }
114
+ for (const exportedName of exportedNames) {
115
+ node = this.buildCall(exportedName, node).expression;
116
+ }
117
+ if (isPostUpdateExpression) {
118
+ node = _core.types.sequenceExpression([node, path.node]);
119
+ }
120
+ path.replaceWith(node);
121
+ }
122
+ };
123
+ return {
124
+ name: "transform-modules-systemjs",
125
+ pre() {
126
+ this.file.set("@babel/plugin-transform-modules-*", "systemjs");
127
+ },
128
+ visitor: {
129
+ CallExpression(path, state) {
130
+ if (_core.types.isImport(path.node.callee)) {
131
+ if (!this.file.has("@babel/plugin-proposal-dynamic-import")) {
132
+ {
133
+ console.warn(MISSING_PLUGIN_WARNING);
134
+ }
135
+ }
136
+ path.replaceWith((0, _helperModuleTransforms.buildDynamicImport)(path.node, false, true, specifier => _core.types.callExpression(_core.types.memberExpression(_core.types.identifier(state.contextIdent), _core.types.identifier("import")), [specifier])));
137
+ }
138
+ },
139
+ MetaProperty(path, state) {
140
+ if (path.node.meta.name === "import" && path.node.property.name === "meta") {
141
+ path.replaceWith(_core.types.memberExpression(_core.types.identifier(state.contextIdent), _core.types.identifier("meta")));
142
+ }
143
+ },
144
+ ReferencedIdentifier(path, state) {
145
+ if (path.node.name === "__moduleName" && !path.scope.hasBinding("__moduleName")) {
146
+ path.replaceWith(_core.types.memberExpression(_core.types.identifier(state.contextIdent), _core.types.identifier("id")));
147
+ }
148
+ },
149
+ Program: {
150
+ enter(path, state) {
151
+ state.contextIdent = path.scope.generateUid("context");
152
+ state.stringSpecifiers = new Set();
153
+ if (!allowTopLevelThis) {
154
+ (0, _helperModuleTransforms.rewriteThis)(path);
155
+ }
156
+ },
157
+ exit(path, state) {
158
+ const scope = path.scope;
159
+ const exportIdent = scope.generateUid("export");
160
+ const {
161
+ contextIdent,
162
+ stringSpecifiers
163
+ } = state;
164
+ const exportMap = Object.create(null);
165
+ const modules = [];
166
+ const beforeBody = [];
167
+ const setters = [];
168
+ const sources = [];
169
+ const variableIds = [];
170
+ const removedPaths = [];
171
+ function addExportName(key, val) {
172
+ exportMap[key] = exportMap[key] || [];
173
+ exportMap[key].push(val);
174
+ }
175
+ function pushModule(source, key, specifiers) {
176
+ let module;
177
+ modules.forEach(function (m) {
178
+ if (m.key === source) {
179
+ module = m;
180
+ }
181
+ });
182
+ if (!module) {
183
+ modules.push(module = {
184
+ key: source,
185
+ imports: [],
186
+ exports: []
187
+ });
188
+ }
189
+ module[key] = module[key].concat(specifiers);
190
+ }
191
+ function buildExportCall(name, val) {
192
+ return _core.types.expressionStatement(_core.types.callExpression(_core.types.identifier(exportIdent), [_core.types.stringLiteral(name), val]));
193
+ }
194
+ const exportNames = [];
195
+ const exportValues = [];
196
+ const body = path.get("body");
197
+ for (const path of body) {
198
+ if (path.isFunctionDeclaration()) {
199
+ beforeBody.push(path.node);
200
+ removedPaths.push(path);
201
+ } else if (path.isClassDeclaration()) {
202
+ variableIds.push(_core.types.cloneNode(path.node.id));
203
+ path.replaceWith(_core.types.expressionStatement(_core.types.assignmentExpression("=", _core.types.cloneNode(path.node.id), _core.types.toExpression(path.node))));
204
+ } else if (path.isVariableDeclaration()) {
205
+ path.node.kind = "var";
206
+ } else if (path.isImportDeclaration()) {
207
+ const source = path.node.source.value;
208
+ pushModule(source, "imports", path.node.specifiers);
209
+ for (const name of Object.keys(path.getBindingIdentifiers())) {
210
+ scope.removeBinding(name);
211
+ variableIds.push(_core.types.identifier(name));
212
+ }
213
+ path.remove();
214
+ } else if (path.isExportAllDeclaration()) {
215
+ pushModule(path.node.source.value, "exports", path.node);
216
+ path.remove();
217
+ } else if (path.isExportDefaultDeclaration()) {
218
+ const declar = path.node.declaration;
219
+ if (_core.types.isClassDeclaration(declar)) {
220
+ const id = declar.id;
221
+ if (id) {
222
+ exportNames.push("default");
223
+ exportValues.push(scope.buildUndefinedNode());
224
+ variableIds.push(_core.types.cloneNode(id));
225
+ addExportName(id.name, "default");
226
+ path.replaceWith(_core.types.expressionStatement(_core.types.assignmentExpression("=", _core.types.cloneNode(id), _core.types.toExpression(declar))));
227
+ } else {
228
+ exportNames.push("default");
229
+ exportValues.push(_core.types.toExpression(declar));
230
+ removedPaths.push(path);
231
+ }
232
+ } else if (_core.types.isFunctionDeclaration(declar)) {
233
+ const id = declar.id;
234
+ if (id) {
235
+ beforeBody.push(declar);
236
+ exportNames.push("default");
237
+ exportValues.push(_core.types.cloneNode(id));
238
+ addExportName(id.name, "default");
239
+ } else {
240
+ exportNames.push("default");
241
+ exportValues.push(_core.types.toExpression(declar));
242
+ }
243
+ removedPaths.push(path);
244
+ } else {
245
+ path.replaceWith(buildExportCall("default", declar));
246
+ }
247
+ } else if (path.isExportNamedDeclaration()) {
248
+ const declar = path.node.declaration;
249
+ if (declar) {
250
+ path.replaceWith(declar);
251
+ if (_core.types.isFunction(declar)) {
252
+ const name = declar.id.name;
253
+ addExportName(name, name);
254
+ beforeBody.push(declar);
255
+ exportNames.push(name);
256
+ exportValues.push(_core.types.cloneNode(declar.id));
257
+ removedPaths.push(path);
258
+ } else if (_core.types.isClass(declar)) {
259
+ const name = declar.id.name;
260
+ exportNames.push(name);
261
+ exportValues.push(scope.buildUndefinedNode());
262
+ variableIds.push(_core.types.cloneNode(declar.id));
263
+ path.replaceWith(_core.types.expressionStatement(_core.types.assignmentExpression("=", _core.types.cloneNode(declar.id), _core.types.toExpression(declar))));
264
+ addExportName(name, name);
265
+ } else {
266
+ if (_core.types.isVariableDeclaration(declar)) {
267
+ declar.kind = "var";
268
+ }
269
+ for (const name of Object.keys(_core.types.getBindingIdentifiers(declar))) {
270
+ addExportName(name, name);
271
+ }
272
+ }
273
+ } else {
274
+ const specifiers = path.node.specifiers;
275
+ if (specifiers != null && specifiers.length) {
276
+ if (path.node.source) {
277
+ pushModule(path.node.source.value, "exports", specifiers);
278
+ path.remove();
279
+ } else {
280
+ const nodes = [];
281
+ for (const specifier of specifiers) {
282
+ const {
283
+ local,
284
+ exported
285
+ } = specifier;
286
+ const binding = scope.getBinding(local.name);
287
+ const exportedName = getExportSpecifierName(exported, stringSpecifiers);
288
+ if (binding && _core.types.isFunctionDeclaration(binding.path.node)) {
289
+ exportNames.push(exportedName);
290
+ exportValues.push(_core.types.cloneNode(local));
291
+ } else if (!binding) {
292
+ nodes.push(buildExportCall(exportedName, local));
293
+ }
294
+ addExportName(local.name, exportedName);
295
+ }
296
+ path.replaceWithMultiple(nodes);
297
+ }
298
+ } else {
299
+ path.remove();
300
+ }
301
+ }
302
+ }
303
+ }
304
+ modules.forEach(function (specifiers) {
305
+ const setterBody = [];
306
+ // --- START FORK CHANGES ---
307
+ const targetHint = state.opts.generateIdentifierHint ? state.opts.generateIdentifierHint(specifiers.key) : specifiers.key;
308
+ const target = scope.generateUid(targetHint);
309
+ // --- END FORK CHANGES ---
310
+ for (let specifier of specifiers.imports) {
311
+ if (_core.types.isImportNamespaceSpecifier(specifier)) {
312
+ setterBody.push(_core.types.expressionStatement(_core.types.assignmentExpression("=", specifier.local, _core.types.identifier(target))));
313
+ } else if (_core.types.isImportDefaultSpecifier(specifier)) {
314
+ specifier = _core.types.importSpecifier(specifier.local, _core.types.identifier("default"));
315
+ }
316
+ if (_core.types.isImportSpecifier(specifier)) {
317
+ const {
318
+ imported
319
+ } = specifier;
320
+ setterBody.push(_core.types.expressionStatement(_core.types.assignmentExpression("=", specifier.local, _core.types.memberExpression(_core.types.identifier(target), specifier.imported, imported.type === "StringLiteral"))));
321
+ }
322
+ }
323
+ if (specifiers.exports.length) {
324
+ const exportNames = [];
325
+ const exportValues = [];
326
+ let hasExportStar = false;
327
+ for (const node of specifiers.exports) {
328
+ if (_core.types.isExportAllDeclaration(node)) {
329
+ hasExportStar = true;
330
+ } else if (_core.types.isExportSpecifier(node)) {
331
+ const exportedName = getExportSpecifierName(node.exported, stringSpecifiers);
332
+ exportNames.push(exportedName);
333
+ exportValues.push(_core.types.memberExpression(_core.types.identifier(target), node.local, _core.types.isStringLiteral(node.local)));
334
+ } else ;
335
+ }
336
+ setterBody.push(...constructExportCall(path, _core.types.identifier(exportIdent), exportNames, exportValues, hasExportStar ? _core.types.identifier(target) : null, stringSpecifiers));
337
+ }
338
+ sources.push(_core.types.stringLiteral(specifiers.key));
339
+ setters.push(_core.types.functionExpression(null, [_core.types.identifier(target)], _core.types.blockStatement(setterBody)));
340
+ });
341
+ let moduleName = (0, _helperModuleTransforms.getModuleName)(this.file.opts, options);
342
+ if (moduleName) moduleName = _core.types.stringLiteral(moduleName);
343
+ (0, _helperHoistVariables.default)(path, (id, name, hasInit) => {
344
+ variableIds.push(id);
345
+ if (!hasInit && name in exportMap) {
346
+ for (const exported of exportMap[name]) {
347
+ exportNames.push(exported);
348
+ exportValues.push(scope.buildUndefinedNode());
349
+ }
350
+ }
351
+ });
352
+ if (variableIds.length) {
353
+ beforeBody.unshift(_core.types.variableDeclaration("var", variableIds.map(id => _core.types.variableDeclarator(id))));
354
+ }
355
+ if (exportNames.length) {
356
+ beforeBody.push(...constructExportCall(path, _core.types.identifier(exportIdent), exportNames, exportValues, null, stringSpecifiers));
357
+ }
358
+ path.traverse(reassignmentVisitor, {
359
+ exports: exportMap,
360
+ buildCall: buildExportCall,
361
+ scope
362
+ });
363
+ for (const path of removedPaths) {
364
+ path.remove();
365
+ }
366
+ let hasTLA = false;
367
+ path.traverse({
368
+ AwaitExpression(path) {
369
+ hasTLA = true;
370
+ path.stop();
371
+ },
372
+ Function(path) {
373
+ path.skip();
374
+ },
375
+ noScope: true
376
+ });
377
+ path.node.body = [buildTemplate({
378
+ SYSTEM_REGISTER: _core.types.memberExpression(_core.types.identifier(systemGlobal), _core.types.identifier("register")),
379
+ BEFORE_BODY: beforeBody,
380
+ MODULE_NAME: moduleName,
381
+ SETTERS: _core.types.arrayExpression(setters),
382
+ EXECUTE: _core.types.functionExpression(null, [], _core.types.blockStatement(path.node.body), false, hasTLA),
383
+ SOURCES: _core.types.arrayExpression(sources),
384
+ EXPORT_IDENTIFIER: _core.types.identifier(exportIdent),
385
+ CONTEXT_IDENTIFIER: _core.types.identifier(contextIdent)
386
+ })];
387
+ }
388
+ }
389
+ }
390
+ };
391
+ });
392
+ exports.default = _default;
package/dist/main.js CHANGED
@@ -14509,7 +14509,21 @@ function default_1({
14509
14509
  };
14510
14510
  }
14511
14511
 
14512
+ /*
14513
+ * When systemjs format is used by babel, it will generated UID based on
14514
+ * the import specifier:
14515
+ * https://github.com/babel/babel/blob/97d1967826077f15e766778c0d64711399e9a72a/packages/babel-plugin-transform-modules-systemjs/src/index.ts#L498
14516
+ * But at this stage import specifier are absolute file urls
14517
+ * So without minification these specifier are long and dependent
14518
+ * on where the files are on the filesystem.
14519
+ * This can be mitigated by minification that will rename them.
14520
+ * But to fix this issue once and for all I have copy-pasted
14521
+ * "@babel/plugin-transform-modules-systemjs" to introduce
14522
+ * "generateIdentifierHint" options and prevent that from hapenning
14523
+ */
14524
+ const TRANSFORM_MODULES_SYSTEMJS_PATH = fileURLToPath(new URL("./js/babel_plugin_transform_modules_systemjs.cjs", import.meta.url));
14512
14525
  const convertJsModuleToJsClassic = async ({
14526
+ rootDirectoryUrl,
14513
14527
  systemJsInjection,
14514
14528
  systemJsClientFileUrl,
14515
14529
  urlInfo,
@@ -14534,7 +14548,16 @@ const convertJsModuleToJsClassic = async ({
14534
14548
  babelPlugins: [...(jsClassicFormat === "system" ? [
14535
14549
  // proposal-dynamic-import required with systemjs for babel8:
14536
14550
  // https://github.com/babel/babel/issues/10746
14537
- requireFromJsenv("@babel/plugin-proposal-dynamic-import"), requireFromJsenv("@babel/plugin-transform-modules-systemjs"), [default_1, {
14551
+ requireFromJsenv("@babel/plugin-proposal-dynamic-import"), [
14552
+ // eslint-disable-next-line import/no-dynamic-require
14553
+ requireFromJsenv(TRANSFORM_MODULES_SYSTEMJS_PATH), {
14554
+ generateIdentifierHint: key => {
14555
+ if (key.startsWith("file://")) {
14556
+ return urlToRelativeUrl(key, rootDirectoryUrl);
14557
+ }
14558
+ return key;
14559
+ }
14560
+ }], [default_1, {
14538
14561
  asyncAwait: false,
14539
14562
  // already handled + we might not needs it at all
14540
14563
  topLevelAwait: "return"
@@ -14668,6 +14691,7 @@ const jsenvPluginAsJsClassicConversion = ({
14668
14691
  content,
14669
14692
  sourcemap
14670
14693
  } = await convertJsModuleToJsClassic({
14694
+ rootDirectoryUrl: context.rootDirectoryUrl,
14671
14695
  systemJsInjection,
14672
14696
  systemJsClientFileUrl,
14673
14697
  urlInfo,
@@ -15012,6 +15036,7 @@ const jsenvPluginAsJsClassicLibrary = ({
15012
15036
  content,
15013
15037
  sourcemap
15014
15038
  } = await convertJsModuleToJsClassic({
15039
+ rootDirectoryUrl: context.rootDirectoryUrl,
15015
15040
  systemJsInjection,
15016
15041
  systemJsClientFileUrl,
15017
15042
  urlInfo,
@@ -15030,18 +15055,6 @@ const jsenvPluginAsJsClassicLibrary = ({
15030
15055
  };
15031
15056
  };
15032
15057
 
15033
- /*
15034
- * Something to keep in mind:
15035
- * When systemjs format is used by babel, it will generated UID based on
15036
- * the import specifier:
15037
- * https://github.com/babel/babel/blob/97d1967826077f15e766778c0d64711399e9a72a/packages/babel-plugin-transform-modules-systemjs/src/index.ts#L498
15038
- * But at this stage import specifier are absolute file urls
15039
- * So without minification these specifier are long and dependent
15040
- * on where the files are on the filesystem.
15041
- * This is mitigated by minification that will shorten them
15042
- * But ideally babel should not generate this in the first place
15043
- * and prefer to unique identifier based solely on the specifier basename for instance
15044
- */
15045
15058
  const jsenvPluginAsJsClassic = ({
15046
15059
  jsClassicLibrary,
15047
15060
  jsClassicFallback,
@@ -20210,6 +20223,44 @@ const getCorePlugins = ({
20210
20223
  })] : [])];
20211
20224
  };
20212
20225
 
20226
+ const ensureUnixLineBreaks = stringOrBuffer => {
20227
+ if (typeof stringOrBuffer === "string") {
20228
+ const stringWithLinuxBreaks = stringOrBuffer.replace(/\r\n/g, "\n");
20229
+ return stringWithLinuxBreaks;
20230
+ }
20231
+ return ensureUnixLineBreaksOnBuffer(stringOrBuffer);
20232
+ };
20233
+
20234
+ // https://github.com/nodejs/help/issues/1738#issuecomment-458460503
20235
+ const ensureUnixLineBreaksOnBuffer = buffer => {
20236
+ const int32Array = new Int32Array(buffer, 0, buffer.length);
20237
+ const int32ArrayWithLineBreaksNormalized = int32Array.filter((element, index, typedArray) => {
20238
+ if (element === 0x0d) {
20239
+ if (typedArray[index + 1] === 0x0a) {
20240
+ // Windows -> Unix
20241
+ return false;
20242
+ }
20243
+ // Mac OS -> Unix
20244
+ typedArray[index] = 0x0a;
20245
+ }
20246
+ return true;
20247
+ });
20248
+ return Buffer.from(int32ArrayWithLineBreaksNormalized);
20249
+ };
20250
+
20251
+ const jsenvPluginLineBreakNormalization = () => {
20252
+ return {
20253
+ name: "jsenv:line_break_normalizer",
20254
+ appliesDuring: "build",
20255
+ transformUrlContent: urlInfo => {
20256
+ if (CONTENT_TYPE.isTextual(urlInfo.contentType)) {
20257
+ return ensureUnixLineBreaks(urlInfo.content);
20258
+ }
20259
+ return null;
20260
+ }
20261
+ };
20262
+ };
20263
+
20213
20264
  const GRAPH = {
20214
20265
  map: (graph, callback) => {
20215
20266
  const array = [];
@@ -20472,42 +20523,13 @@ const injectVersionMappingsAsImportmap = async ({
20472
20523
  });
20473
20524
  };
20474
20525
 
20475
- const ensureUnixLineBreaks = stringOrBuffer => {
20476
- if (typeof stringOrBuffer === "string") {
20477
- const stringWithLinuxBreaks = stringOrBuffer.replace(/\r\n/g, "\n");
20478
- return stringWithLinuxBreaks;
20479
- }
20480
- return ensureUnixLineBreaksOnBuffer(stringOrBuffer);
20481
- };
20482
-
20483
- // https://github.com/nodejs/help/issues/1738#issuecomment-458460503
20484
- const ensureUnixLineBreaksOnBuffer = buffer => {
20485
- const int32Array = new Int32Array(buffer, 0, buffer.length);
20486
- const int32ArrayWithLineBreaksNormalized = int32Array.filter((element, index, typedArray) => {
20487
- if (element === 0x0d) {
20488
- if (typedArray[index + 1] === 0x0a) {
20489
- // Windows -> Unix
20490
- return false;
20491
- }
20492
- // Mac OS -> Unix
20493
- typedArray[index] = 0x0a;
20494
- }
20495
- return true;
20496
- });
20497
- return Buffer.from(int32ArrayWithLineBreaksNormalized);
20498
- };
20499
-
20500
20526
  // https://github.com/rollup/rollup/blob/19e50af3099c2f627451a45a84e2fa90d20246d5/src/utils/FileEmitter.ts#L47
20501
20527
  // https://github.com/rollup/rollup/blob/5a5391971d695c808eed0c5d7d2c6ccb594fc689/src/Chunk.ts#L870
20502
20528
  const createVersionGenerator = () => {
20503
20529
  const hash = createHash("sha256");
20504
20530
  return {
20505
- augmentWithContent: ({
20506
- content,
20507
- contentType = "application/octet-stream",
20508
- lineBreakNormalization = false
20509
- }) => {
20510
- hash.update(lineBreakNormalization && CONTENT_TYPE.isTextual(contentType) ? ensureUnixLineBreaks(content) : content);
20531
+ augmentWithContent: content => {
20532
+ hash.update(content);
20511
20533
  },
20512
20534
  augment: value => {
20513
20535
  hash.update(value);
@@ -20759,7 +20781,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
20759
20781
  build: true,
20760
20782
  runtimeCompat,
20761
20783
  ...contextSharedDuringBuild,
20762
- plugins: [urlAnalysisPlugin, jsenvPluginAsJsClassic({
20784
+ plugins: [urlAnalysisPlugin, ...(lineBreakNormalization ? [jsenvPluginLineBreakNormalization()] : []), jsenvPluginAsJsClassic({
20763
20785
  jsClassicLibrary: false,
20764
20786
  jsClassicFallback: true,
20765
20787
  systemJsInjection: true
@@ -21351,11 +21373,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
21351
21373
  cleanupJsenvAttributes: true
21352
21374
  }) : urlInfo.content;
21353
21375
  const contentVersionGenerator = createVersionGenerator();
21354
- contentVersionGenerator.augmentWithContent({
21355
- content: urlContent,
21356
- contentType: urlInfo.contentType,
21357
- lineBreakNormalization
21358
- });
21376
+ contentVersionGenerator.augmentWithContent(urlContent);
21359
21377
  const contentVersion = contentVersionGenerator.generate();
21360
21378
  contentVersionMap.set(urlInfo.url, contentVersion);
21361
21379
  const versionMutations = [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/core",
3
- "version": "30.3.7",
3
+ "version": "30.3.9",
4
4
  "description": "Tool to develop, test and build js projects",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -67,6 +67,7 @@ import { jsenvPluginUrlAnalysis } from "../plugins/url_analysis/jsenv_plugin_url
67
67
  import { jsenvPluginInline } from "../plugins/inline/jsenv_plugin_inline.js"
68
68
  import { jsenvPluginAsJsClassic } from "../plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic.js"
69
69
  import { getCorePlugins } from "../plugins/plugins.js"
70
+ import { jsenvPluginLineBreakNormalization } from "./jsenv_plugin_line_break_normalization.js"
70
71
 
71
72
  import { GRAPH } from "./graph_utils.js"
72
73
  import { createBuildUrlsGenerator } from "./build_urls_generator.js"
@@ -333,6 +334,9 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
333
334
  ...contextSharedDuringBuild,
334
335
  plugins: [
335
336
  urlAnalysisPlugin,
337
+ ...(lineBreakNormalization
338
+ ? [jsenvPluginLineBreakNormalization()]
339
+ : []),
336
340
  jsenvPluginAsJsClassic({
337
341
  jsClassicLibrary: false,
338
342
  jsClassicFallback: true,
@@ -1017,11 +1021,7 @@ ${ANSI.color(buildUrl, ANSI.MAGENTA)}
1017
1021
  )
1018
1022
  : urlInfo.content
1019
1023
  const contentVersionGenerator = createVersionGenerator()
1020
- contentVersionGenerator.augmentWithContent({
1021
- content: urlContent,
1022
- contentType: urlInfo.contentType,
1023
- lineBreakNormalization,
1024
- })
1024
+ contentVersionGenerator.augmentWithContent(urlContent)
1025
1025
  const contentVersion = contentVersionGenerator.generate()
1026
1026
  contentVersionMap.set(urlInfo.url, contentVersion)
1027
1027
  const versionMutations = []
@@ -0,0 +1,16 @@
1
+ import { CONTENT_TYPE } from "@jsenv/utils/src/content_type/content_type.js"
2
+
3
+ import { ensureUnixLineBreaks } from "./line_break_unix.js"
4
+
5
+ export const jsenvPluginLineBreakNormalization = () => {
6
+ return {
7
+ name: "jsenv:line_break_normalizer",
8
+ appliesDuring: "build",
9
+ transformUrlContent: (urlInfo) => {
10
+ if (CONTENT_TYPE.isTextual(urlInfo.contentType)) {
11
+ return ensureUnixLineBreaks(urlInfo.content)
12
+ }
13
+ return null
14
+ },
15
+ }
16
+ }
@@ -1,24 +1,13 @@
1
1
  import { createHash } from "node:crypto"
2
2
 
3
- import { CONTENT_TYPE } from "@jsenv/utils/src/content_type/content_type.js"
4
- import { ensureUnixLineBreaks } from "./line_break_unix.js"
5
-
6
3
  // https://github.com/rollup/rollup/blob/19e50af3099c2f627451a45a84e2fa90d20246d5/src/utils/FileEmitter.ts#L47
7
4
  // https://github.com/rollup/rollup/blob/5a5391971d695c808eed0c5d7d2c6ccb594fc689/src/Chunk.ts#L870
8
5
  export const createVersionGenerator = () => {
9
6
  const hash = createHash("sha256")
10
7
 
11
8
  return {
12
- augmentWithContent: ({
13
- content,
14
- contentType = "application/octet-stream",
15
- lineBreakNormalization = false,
16
- }) => {
17
- hash.update(
18
- lineBreakNormalization && CONTENT_TYPE.isTextual(contentType)
19
- ? ensureUnixLineBreaks(content)
20
- : content,
21
- )
9
+ augmentWithContent: (content) => {
10
+ hash.update(content)
22
11
  },
23
12
  augment: (value) => {
24
13
  hash.update(value)
@@ -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,
@@ -74,6 +74,7 @@ export const jsenvPluginAsJsClassicLibrary = ({
74
74
  })
75
75
  }
76
76
  const { content, sourcemap } = await convertJsModuleToJsClassic({
77
+ rootDirectoryUrl: context.rootDirectoryUrl,
77
78
  systemJsInjection,
78
79
  systemJsClientFileUrl,
79
80
  urlInfo,