51 lines
2.3 KiB
JavaScript
51 lines
2.3 KiB
JavaScript
"use strict";
|
|
/**
|
|
* Copyright (c) 650 Industries (Expo). All rights reserved.
|
|
* Copyright (c) 2014-present Sebastian McKenzie and other contributors
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
// Original: https://github.com/babel/babel/blob/e5c8dc7330cb2f66c37637677609df90b31ff0de/packages/babel-plugin-transform-export-namespace-from/src/index.ts
|
|
// NOTE: Original plugin asserts that Babel version 7 or newer is used. This was removed for simplicity.
|
|
exports.default = ({ types: t }) => ({
|
|
name: 'transform-export-namespace-from',
|
|
manipulateOptions: process.env.BABEL_8_BREAKING
|
|
? undefined
|
|
: (_, parser) => parser.plugins.push('exportNamespaceFrom'),
|
|
visitor: {
|
|
ExportNamedDeclaration(path) {
|
|
const { node, scope } = path;
|
|
const { specifiers } = node;
|
|
const index = t.isExportDefaultSpecifier(specifiers[0]) ? 1 : 0;
|
|
if (!t.isExportNamespaceSpecifier(specifiers[index]))
|
|
return;
|
|
const nodes = [];
|
|
if (index === 1) {
|
|
nodes.push(t.exportNamedDeclaration(null, [specifiers.shift()], node.source));
|
|
}
|
|
const specifier = specifiers.shift();
|
|
const { exported } = specifier;
|
|
const uid = scope.generateUidIdentifier(
|
|
// @ts-expect-error Identifier ?? StringLiteral
|
|
exported.name ?? exported.value);
|
|
nodes.push(withLocation(t.importDeclaration([t.importNamespaceSpecifier(uid)],
|
|
// @ts-expect-error
|
|
t.cloneNode(node.source)), node.loc), withLocation(t.exportNamedDeclaration(null, [t.exportSpecifier(t.cloneNode(uid), exported)]), node.loc));
|
|
if (node.specifiers.length >= 1) {
|
|
nodes.push(node);
|
|
}
|
|
const [importDeclaration] = path.replaceWithMultiple(nodes);
|
|
path.scope.registerDeclaration(importDeclaration);
|
|
},
|
|
},
|
|
});
|
|
// Inspired by https://github.com/facebook/metro/blob/8e48aa823378962beccbe37d85f1aff2c34b28b1/packages/metro-transform-plugins/src/import-export-plugin.js#L143
|
|
function withLocation(node, loc) {
|
|
if (!node.loc) {
|
|
return { ...node, loc };
|
|
}
|
|
return node;
|
|
}
|