1 | "use strict";
|
---|
2 |
|
---|
3 | Object.defineProperty(exports, "__esModule", {
|
---|
4 | value: true
|
---|
5 | });
|
---|
6 | exports.default = normalizeModuleAndLoadMetadata;
|
---|
7 | exports.hasExports = hasExports;
|
---|
8 | exports.isSideEffectImport = isSideEffectImport;
|
---|
9 | exports.validateImportInteropOption = validateImportInteropOption;
|
---|
10 | var _path = require("path");
|
---|
11 | var _helperValidatorIdentifier = require("@babel/helper-validator-identifier");
|
---|
12 | function hasExports(metadata) {
|
---|
13 | return metadata.hasExports;
|
---|
14 | }
|
---|
15 | function isSideEffectImport(source) {
|
---|
16 | return source.imports.size === 0 && source.importsNamespace.size === 0 && source.reexports.size === 0 && source.reexportNamespace.size === 0 && !source.reexportAll;
|
---|
17 | }
|
---|
18 | function validateImportInteropOption(importInterop) {
|
---|
19 | if (typeof importInterop !== "function" && importInterop !== "none" && importInterop !== "babel" && importInterop !== "node") {
|
---|
20 | throw new Error(`.importInterop must be one of "none", "babel", "node", or a function returning one of those values (received ${importInterop}).`);
|
---|
21 | }
|
---|
22 | return importInterop;
|
---|
23 | }
|
---|
24 | function resolveImportInterop(importInterop, source, filename) {
|
---|
25 | if (typeof importInterop === "function") {
|
---|
26 | return validateImportInteropOption(importInterop(source, filename));
|
---|
27 | }
|
---|
28 | return importInterop;
|
---|
29 | }
|
---|
30 | function normalizeModuleAndLoadMetadata(programPath, exportName, {
|
---|
31 | importInterop,
|
---|
32 | initializeReexports = false,
|
---|
33 | getWrapperPayload,
|
---|
34 | esNamespaceOnly = false,
|
---|
35 | filename
|
---|
36 | }) {
|
---|
37 | if (!exportName) {
|
---|
38 | exportName = programPath.scope.generateUidIdentifier("exports").name;
|
---|
39 | }
|
---|
40 | const stringSpecifiers = new Set();
|
---|
41 | nameAnonymousExports(programPath);
|
---|
42 | const {
|
---|
43 | local,
|
---|
44 | sources,
|
---|
45 | hasExports
|
---|
46 | } = getModuleMetadata(programPath, {
|
---|
47 | initializeReexports,
|
---|
48 | getWrapperPayload
|
---|
49 | }, stringSpecifiers);
|
---|
50 | removeImportExportDeclarations(programPath);
|
---|
51 | for (const [source, metadata] of sources) {
|
---|
52 | const {
|
---|
53 | importsNamespace,
|
---|
54 | imports
|
---|
55 | } = metadata;
|
---|
56 | if (importsNamespace.size > 0 && imports.size === 0) {
|
---|
57 | const [nameOfnamespace] = importsNamespace;
|
---|
58 | metadata.name = nameOfnamespace;
|
---|
59 | }
|
---|
60 | const resolvedInterop = resolveImportInterop(importInterop, source, filename);
|
---|
61 | if (resolvedInterop === "none") {
|
---|
62 | metadata.interop = "none";
|
---|
63 | } else if (resolvedInterop === "node" && metadata.interop === "namespace") {
|
---|
64 | metadata.interop = "node-namespace";
|
---|
65 | } else if (resolvedInterop === "node" && metadata.interop === "default") {
|
---|
66 | metadata.interop = "node-default";
|
---|
67 | } else if (esNamespaceOnly && metadata.interop === "namespace") {
|
---|
68 | metadata.interop = "default";
|
---|
69 | }
|
---|
70 | }
|
---|
71 | return {
|
---|
72 | exportName,
|
---|
73 | exportNameListName: null,
|
---|
74 | hasExports,
|
---|
75 | local,
|
---|
76 | source: sources,
|
---|
77 | stringSpecifiers
|
---|
78 | };
|
---|
79 | }
|
---|
80 | function getExportSpecifierName(path, stringSpecifiers) {
|
---|
81 | if (path.isIdentifier()) {
|
---|
82 | return path.node.name;
|
---|
83 | } else if (path.isStringLiteral()) {
|
---|
84 | const stringValue = path.node.value;
|
---|
85 | if (!(0, _helperValidatorIdentifier.isIdentifierName)(stringValue)) {
|
---|
86 | stringSpecifiers.add(stringValue);
|
---|
87 | }
|
---|
88 | return stringValue;
|
---|
89 | } else {
|
---|
90 | throw new Error(`Expected export specifier to be either Identifier or StringLiteral, got ${path.node.type}`);
|
---|
91 | }
|
---|
92 | }
|
---|
93 | function assertExportSpecifier(path) {
|
---|
94 | if (path.isExportSpecifier()) {
|
---|
95 | return;
|
---|
96 | } else if (path.isExportNamespaceSpecifier()) {
|
---|
97 | throw path.buildCodeFrameError("Export namespace should be first transformed by `@babel/plugin-transform-export-namespace-from`.");
|
---|
98 | } else {
|
---|
99 | throw path.buildCodeFrameError("Unexpected export specifier type");
|
---|
100 | }
|
---|
101 | }
|
---|
102 | function getModuleMetadata(programPath, {
|
---|
103 | getWrapperPayload,
|
---|
104 | initializeReexports
|
---|
105 | }, stringSpecifiers) {
|
---|
106 | const localData = getLocalExportMetadata(programPath, initializeReexports, stringSpecifiers);
|
---|
107 | const importNodes = new Map();
|
---|
108 | const sourceData = new Map();
|
---|
109 | const getData = (sourceNode, node) => {
|
---|
110 | const source = sourceNode.value;
|
---|
111 | let data = sourceData.get(source);
|
---|
112 | if (!data) {
|
---|
113 | data = {
|
---|
114 | name: programPath.scope.generateUidIdentifier((0, _path.basename)(source, (0, _path.extname)(source))).name,
|
---|
115 | interop: "none",
|
---|
116 | loc: null,
|
---|
117 | imports: new Map(),
|
---|
118 | importsNamespace: new Set(),
|
---|
119 | reexports: new Map(),
|
---|
120 | reexportNamespace: new Set(),
|
---|
121 | reexportAll: null,
|
---|
122 | wrap: null,
|
---|
123 | get lazy() {
|
---|
124 | return this.wrap === "lazy";
|
---|
125 | },
|
---|
126 | referenced: false
|
---|
127 | };
|
---|
128 | sourceData.set(source, data);
|
---|
129 | importNodes.set(source, [node]);
|
---|
130 | } else {
|
---|
131 | importNodes.get(source).push(node);
|
---|
132 | }
|
---|
133 | return data;
|
---|
134 | };
|
---|
135 | let hasExports = false;
|
---|
136 | programPath.get("body").forEach(child => {
|
---|
137 | if (child.isImportDeclaration()) {
|
---|
138 | const data = getData(child.node.source, child.node);
|
---|
139 | if (!data.loc) data.loc = child.node.loc;
|
---|
140 | child.get("specifiers").forEach(spec => {
|
---|
141 | if (spec.isImportDefaultSpecifier()) {
|
---|
142 | const localName = spec.get("local").node.name;
|
---|
143 | data.imports.set(localName, "default");
|
---|
144 | const reexport = localData.get(localName);
|
---|
145 | if (reexport) {
|
---|
146 | localData.delete(localName);
|
---|
147 | reexport.names.forEach(name => {
|
---|
148 | data.reexports.set(name, "default");
|
---|
149 | });
|
---|
150 | data.referenced = true;
|
---|
151 | }
|
---|
152 | } else if (spec.isImportNamespaceSpecifier()) {
|
---|
153 | const localName = spec.get("local").node.name;
|
---|
154 | data.importsNamespace.add(localName);
|
---|
155 | const reexport = localData.get(localName);
|
---|
156 | if (reexport) {
|
---|
157 | localData.delete(localName);
|
---|
158 | reexport.names.forEach(name => {
|
---|
159 | data.reexportNamespace.add(name);
|
---|
160 | });
|
---|
161 | data.referenced = true;
|
---|
162 | }
|
---|
163 | } else if (spec.isImportSpecifier()) {
|
---|
164 | const importName = getExportSpecifierName(spec.get("imported"), stringSpecifiers);
|
---|
165 | const localName = spec.get("local").node.name;
|
---|
166 | data.imports.set(localName, importName);
|
---|
167 | const reexport = localData.get(localName);
|
---|
168 | if (reexport) {
|
---|
169 | localData.delete(localName);
|
---|
170 | reexport.names.forEach(name => {
|
---|
171 | data.reexports.set(name, importName);
|
---|
172 | });
|
---|
173 | data.referenced = true;
|
---|
174 | }
|
---|
175 | }
|
---|
176 | });
|
---|
177 | } else if (child.isExportAllDeclaration()) {
|
---|
178 | hasExports = true;
|
---|
179 | const data = getData(child.node.source, child.node);
|
---|
180 | if (!data.loc) data.loc = child.node.loc;
|
---|
181 | data.reexportAll = {
|
---|
182 | loc: child.node.loc
|
---|
183 | };
|
---|
184 | data.referenced = true;
|
---|
185 | } else if (child.isExportNamedDeclaration() && child.node.source) {
|
---|
186 | hasExports = true;
|
---|
187 | const data = getData(child.node.source, child.node);
|
---|
188 | if (!data.loc) data.loc = child.node.loc;
|
---|
189 | child.get("specifiers").forEach(spec => {
|
---|
190 | assertExportSpecifier(spec);
|
---|
191 | const importName = getExportSpecifierName(spec.get("local"), stringSpecifiers);
|
---|
192 | const exportName = getExportSpecifierName(spec.get("exported"), stringSpecifiers);
|
---|
193 | data.reexports.set(exportName, importName);
|
---|
194 | data.referenced = true;
|
---|
195 | if (exportName === "__esModule") {
|
---|
196 | throw spec.get("exported").buildCodeFrameError('Illegal export "__esModule".');
|
---|
197 | }
|
---|
198 | });
|
---|
199 | } else if (child.isExportNamedDeclaration() || child.isExportDefaultDeclaration()) {
|
---|
200 | hasExports = true;
|
---|
201 | }
|
---|
202 | });
|
---|
203 | for (const metadata of sourceData.values()) {
|
---|
204 | let needsDefault = false;
|
---|
205 | let needsNamed = false;
|
---|
206 | if (metadata.importsNamespace.size > 0) {
|
---|
207 | needsDefault = true;
|
---|
208 | needsNamed = true;
|
---|
209 | }
|
---|
210 | if (metadata.reexportAll) {
|
---|
211 | needsNamed = true;
|
---|
212 | }
|
---|
213 | for (const importName of metadata.imports.values()) {
|
---|
214 | if (importName === "default") needsDefault = true;else needsNamed = true;
|
---|
215 | }
|
---|
216 | for (const importName of metadata.reexports.values()) {
|
---|
217 | if (importName === "default") needsDefault = true;else needsNamed = true;
|
---|
218 | }
|
---|
219 | if (needsDefault && needsNamed) {
|
---|
220 | metadata.interop = "namespace";
|
---|
221 | } else if (needsDefault) {
|
---|
222 | metadata.interop = "default";
|
---|
223 | }
|
---|
224 | }
|
---|
225 | if (getWrapperPayload) {
|
---|
226 | for (const [source, metadata] of sourceData) {
|
---|
227 | metadata.wrap = getWrapperPayload(source, metadata, importNodes.get(source));
|
---|
228 | }
|
---|
229 | }
|
---|
230 | return {
|
---|
231 | hasExports,
|
---|
232 | local: localData,
|
---|
233 | sources: sourceData
|
---|
234 | };
|
---|
235 | }
|
---|
236 | function getLocalExportMetadata(programPath, initializeReexports, stringSpecifiers) {
|
---|
237 | const bindingKindLookup = new Map();
|
---|
238 | programPath.get("body").forEach(child => {
|
---|
239 | let kind;
|
---|
240 | if (child.isImportDeclaration()) {
|
---|
241 | kind = "import";
|
---|
242 | } else {
|
---|
243 | if (child.isExportDefaultDeclaration()) {
|
---|
244 | child = child.get("declaration");
|
---|
245 | }
|
---|
246 | if (child.isExportNamedDeclaration()) {
|
---|
247 | if (child.node.declaration) {
|
---|
248 | child = child.get("declaration");
|
---|
249 | } else if (initializeReexports && child.node.source && child.get("source").isStringLiteral()) {
|
---|
250 | child.get("specifiers").forEach(spec => {
|
---|
251 | assertExportSpecifier(spec);
|
---|
252 | bindingKindLookup.set(spec.get("local").node.name, "block");
|
---|
253 | });
|
---|
254 | return;
|
---|
255 | }
|
---|
256 | }
|
---|
257 | if (child.isFunctionDeclaration()) {
|
---|
258 | kind = "hoisted";
|
---|
259 | } else if (child.isClassDeclaration()) {
|
---|
260 | kind = "block";
|
---|
261 | } else if (child.isVariableDeclaration({
|
---|
262 | kind: "var"
|
---|
263 | })) {
|
---|
264 | kind = "var";
|
---|
265 | } else if (child.isVariableDeclaration()) {
|
---|
266 | kind = "block";
|
---|
267 | } else {
|
---|
268 | return;
|
---|
269 | }
|
---|
270 | }
|
---|
271 | Object.keys(child.getOuterBindingIdentifiers()).forEach(name => {
|
---|
272 | bindingKindLookup.set(name, kind);
|
---|
273 | });
|
---|
274 | });
|
---|
275 | const localMetadata = new Map();
|
---|
276 | const getLocalMetadata = idPath => {
|
---|
277 | const localName = idPath.node.name;
|
---|
278 | let metadata = localMetadata.get(localName);
|
---|
279 | if (!metadata) {
|
---|
280 | const kind = bindingKindLookup.get(localName);
|
---|
281 | if (kind === undefined) {
|
---|
282 | throw idPath.buildCodeFrameError(`Exporting local "${localName}", which is not declared.`);
|
---|
283 | }
|
---|
284 | metadata = {
|
---|
285 | names: [],
|
---|
286 | kind
|
---|
287 | };
|
---|
288 | localMetadata.set(localName, metadata);
|
---|
289 | }
|
---|
290 | return metadata;
|
---|
291 | };
|
---|
292 | programPath.get("body").forEach(child => {
|
---|
293 | if (child.isExportNamedDeclaration() && (initializeReexports || !child.node.source)) {
|
---|
294 | if (child.node.declaration) {
|
---|
295 | const declaration = child.get("declaration");
|
---|
296 | const ids = declaration.getOuterBindingIdentifierPaths();
|
---|
297 | Object.keys(ids).forEach(name => {
|
---|
298 | if (name === "__esModule") {
|
---|
299 | throw declaration.buildCodeFrameError('Illegal export "__esModule".');
|
---|
300 | }
|
---|
301 | getLocalMetadata(ids[name]).names.push(name);
|
---|
302 | });
|
---|
303 | } else {
|
---|
304 | child.get("specifiers").forEach(spec => {
|
---|
305 | const local = spec.get("local");
|
---|
306 | const exported = spec.get("exported");
|
---|
307 | const localMetadata = getLocalMetadata(local);
|
---|
308 | const exportName = getExportSpecifierName(exported, stringSpecifiers);
|
---|
309 | if (exportName === "__esModule") {
|
---|
310 | throw exported.buildCodeFrameError('Illegal export "__esModule".');
|
---|
311 | }
|
---|
312 | localMetadata.names.push(exportName);
|
---|
313 | });
|
---|
314 | }
|
---|
315 | } else if (child.isExportDefaultDeclaration()) {
|
---|
316 | const declaration = child.get("declaration");
|
---|
317 | if (declaration.isFunctionDeclaration() || declaration.isClassDeclaration()) {
|
---|
318 | getLocalMetadata(declaration.get("id")).names.push("default");
|
---|
319 | } else {
|
---|
320 | throw declaration.buildCodeFrameError("Unexpected default expression export.");
|
---|
321 | }
|
---|
322 | }
|
---|
323 | });
|
---|
324 | return localMetadata;
|
---|
325 | }
|
---|
326 | function nameAnonymousExports(programPath) {
|
---|
327 | programPath.get("body").forEach(child => {
|
---|
328 | if (!child.isExportDefaultDeclaration()) return;
|
---|
329 | {
|
---|
330 | var _child$splitExportDec;
|
---|
331 | (_child$splitExportDec = child.splitExportDeclaration) != null ? _child$splitExportDec : child.splitExportDeclaration = require("@babel/traverse").NodePath.prototype.splitExportDeclaration;
|
---|
332 | }
|
---|
333 | child.splitExportDeclaration();
|
---|
334 | });
|
---|
335 | }
|
---|
336 | function removeImportExportDeclarations(programPath) {
|
---|
337 | programPath.get("body").forEach(child => {
|
---|
338 | if (child.isImportDeclaration()) {
|
---|
339 | child.remove();
|
---|
340 | } else if (child.isExportNamedDeclaration()) {
|
---|
341 | if (child.node.declaration) {
|
---|
342 | child.node.declaration._blockHoist = child.node._blockHoist;
|
---|
343 | child.replaceWith(child.node.declaration);
|
---|
344 | } else {
|
---|
345 | child.remove();
|
---|
346 | }
|
---|
347 | } else if (child.isExportDefaultDeclaration()) {
|
---|
348 | const declaration = child.get("declaration");
|
---|
349 | if (declaration.isFunctionDeclaration() || declaration.isClassDeclaration()) {
|
---|
350 | declaration._blockHoist = child.node._blockHoist;
|
---|
351 | child.replaceWith(declaration);
|
---|
352 | } else {
|
---|
353 | throw declaration.buildCodeFrameError("Unexpected default expression export.");
|
---|
354 | }
|
---|
355 | } else if (child.isExportAllDeclaration()) {
|
---|
356 | child.remove();
|
---|
357 | }
|
---|
358 | });
|
---|
359 | }
|
---|
360 |
|
---|
361 | //# sourceMappingURL=normalize-and-load-metadata.js.map
|
---|