@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.
- package/dist/js/babel_plugin_transform_modules_systemjs.cjs +392 -0
- package/dist/main.js +68 -50
- package/package.json +1 -1
- package/src/build/build.js +5 -5
- package/src/build/jsenv_plugin_line_break_normalization.js +16 -0
- package/src/build/version_generator.js +2 -13
- package/src/plugins/transpilation/as_js_classic/babel_plugin_transform_modules_systemjs.cjs +608 -0
- package/src/plugins/transpilation/as_js_classic/convert_js_module_to_js_classic.js +31 -1
- package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic.js +0 -13
- package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic_conversion.js +1 -0
- package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic_library.js +1 -0
|
@@ -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"),
|
|
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
package/src/build/build.js
CHANGED
|
@@ -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
|
-
|
|
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,
|