Convert UMD to use new implementation of module logic.

This commit is contained in:
Logan Smyth 2017-09-11 15:01:17 -07:00
parent 47a254025a
commit 95e08b6d2a
60 changed files with 1511 additions and 283 deletions

View File

@ -1,7 +1,7 @@
{
"settings": {
"rulers": [
110
80
],
// Set to false to disable detection of tabs vs. spaces on load

View File

@ -0,0 +1,3 @@
src
test
*.log

View File

@ -0,0 +1,5 @@
# babel-helper-modules
## Usage
TODO

View File

@ -0,0 +1,15 @@
{
"name": "babel-helper-modules",
"version": "7.0.0-beta.0",
"description": "Babel helper functions for implementing ES6 module transformations",
"author": "Logan Smyth <loganfsmyth@gmail.com>",
"homepage": "https://babeljs.io/",
"license": "MIT",
"repository": "https://github.com/babel/babel/tree/master/packages/babel-helper-modules",
"main": "lib/index.js",
"dependencies": {
"babel-template": "7.0.0-beta.0",
"babel-types": "7.0.0-beta.0",
"lodash": "^4.2.0"
}
}

View File

@ -0,0 +1,302 @@
import * as t from "babel-types";
import template from "babel-template";
import chunk from "lodash/chunk";
import rewriteThis from "./rewrite-this";
import rewriteLiveReferences from "./rewrite-live-references";
import normalizeAndLoadModuleMetadata, {
hasExports,
isSideEffectImport,
} from "./normalize-and-load-metadata";
export { hasExports };
/**
* Perform all of the generic ES6 module rewriting needed to handle initial
* module processing. This function will rewrite the majority of the given
* program to reference the modules described by the returned metadata,
* and returns a list of statements for use when initializing the module.
*/
export function rewriteModuleStatementsAndPrepareHeader(
path: NodePath,
{ exportName, strict, allowTopLevelThis, strictMode, loose, noInterop },
) {
const meta = normalizeAndLoadModuleMetadata(path, exportName, {
strict,
noInterop,
});
if (!allowTopLevelThis) {
rewriteThis(path);
}
rewriteLiveReferences(path, meta);
if (strictMode !== false && strict !== false) {
const hasStrict = path.node.directives.some(directive => {
return directive.value.value === "use strict";
});
if (!hasStrict) {
path.unshiftContainer(
"directives",
t.directive(t.directiveLiteral("use strict")),
);
}
}
const headers = [];
if (hasExports(meta) && !strict) {
headers.push(buildESModuleHeader(meta, loose /* enumerable */));
}
// Create all of the statically known named exports.
headers.push(...buildExportInitializationStatements(path, meta));
return { meta, headers };
}
/**
* Break down the module metadata into a simple array that contains the
* fields generally needed for compiling ES6 module support.
*/
export function getSourceMetadataArray(meta: ModuleMetadata) {
const lastNonSideEffectBlock = Array.from(
meta.source,
).reduceRight((acc, [source, metadata]) => {
if (acc !== null) return acc;
if (isSideEffectImport(metadata)) return null;
return source;
}, null);
let inSideEffectBlock = lastNonSideEffectBlock === null;
const items = [];
for (const [source, metadata] of meta.source) {
const isSideEffect = isSideEffectImport(metadata);
items.push([source, metadata, isSideEffect, inSideEffectBlock]);
if (source === lastNonSideEffectBlock) inSideEffectBlock = true;
}
return items;
}
/**
* Flag a set of statements as hoisted above all else so that module init
* statements all run before user code.
*/
export function ensureStatementsHoisted(statements) {
// Force all of the header fields to be at the top of the file.
statements.forEach(header => {
header._blockHoist = 3;
});
}
/**
* Given an expression for a standard import object, like "require('foo')",
* wrap it in a call to the interop helpers based on the type.
*/
export function wrapInterop(
programPath: NodePath,
expr: Node,
type: InteropType,
): Node {
if (type === "none") {
return null;
}
let helper;
if (type === "default") {
helper = "interopRequireDefault";
} else if (type === "namespace") {
helper = "interopRequireWildcard";
} else {
throw new Error(`Unknown interop: ${type}`);
}
return t.callExpression(programPath.hub.file.addHelper(helper), [expr]);
}
const buildNamespaceInit = template(`
var NAME = SOURCE;
`);
const buildReexportNamespace = template(`
EXPORTS.NAME = NAMESPACE;
`);
/**
* Create the runtime initialization statements for a given requested source.
* These will initialize all of the runtime import/export logic that
* can't be handled statically by the statements created by
* buildExportInitializationStatements().
*/
export function buildNamespaceInitStatements(
metadata: ModuleMetadata,
sourceMetadata: SourceModuleMetadata,
) {
const statements = [];
for (const localName of sourceMetadata.importsNamespace) {
if (localName === sourceMetadata.name) continue;
// Create and assign binding to namespace object
statements.push(
buildNamespaceInit({
NAME: t.identifier(localName),
SOURCE: t.identifier(sourceMetadata.name),
}),
);
}
for (const exportName of sourceMetadata.reexportNamespace) {
// Assign export to namespace object.
statements.push(
buildReexportNamespace({
EXPORTS: t.identifier(metadata.exportName),
NAME: t.identifier(exportName),
NAMESPACE: t.identifier(sourceMetadata.name),
}),
);
}
if (sourceMetadata.reexportAll) {
const statement = buildNamespaceReexport(metadata, sourceMetadata.name);
statement.loc = sourceMetadata.reexportAll.loc;
// Iterate props creating getter for each prop.
statements.push(statement);
}
return statements;
}
const moduleHeader = template(`
Object.defineProperty(EXPORTS, "__esModule", {
value: true,
})
`);
const moduleHeaderLoose = template(`
EXPORTS.__esModule = true;
`);
/**
* Build an "__esModule" header statement setting the property on a given object.
*/
function buildESModuleHeader(
metadata: ModuleMetadata,
enumerable: boolean = false,
) {
if (enumerable) {
return moduleHeaderLoose({
EXPORTS: t.identifier(metadata.exportName),
});
}
return moduleHeader({
EXPORTS: t.identifier(metadata.exportName),
});
}
const namespaceReexport = template(`
Object.keys(NAMESPACE).forEach(function(key) {
if (key === "default" || key === "__esModule") return;
Object.defineProperty(EXPORTS, key, {
enumerable: true,
get: function() {
return NAMESPACE[key];
},
});
});
`);
/**
* Create a re-export initialization loop for a specific imported namespace.
*/
function buildNamespaceReexport(metadata, namespace) {
// TODO: This should skip exporting a prop that is already exported.
return namespaceReexport({
NAMESPACE: t.identifier(namespace),
EXPORTS: t.identifier(metadata.exportName),
});
}
const reexportGetter = template(`
Object.defineProperty(EXPORTS, EXPORT_NAME, {
enumerable: true,
get: function() {
return NAMESPACE.IMPORT_NAME;
},
});
`);
/**
* Create a set of statements that will initialize all of the statically-known
* export names with their expected values.
*/
function buildExportInitializationStatements(
programPath: NodePath,
metadata: ModuleMetadata,
) {
const initStatements = [];
const exportNames = [];
for (const [localName, data] of metadata.local) {
if (data.kind === "import") {
// No-open since these are explicitly set with the "reexports" block.
} else if (data.kind === "hoisted") {
initStatements.push(
buildInitStatement(metadata, data.names, t.identifier(localName)),
);
} else {
exportNames.push(...data.names);
}
}
for (const [, data] of metadata.source) {
for (const [exportName, importName] of data.reexports) {
initStatements.push(
reexportGetter({
EXPORTS: t.identifier(metadata.exportName),
EXPORT_NAME: t.stringLiteral(exportName),
NAMESPACE: t.identifier(data.name),
IMPORT_NAME: t.identifier(importName),
}),
);
}
for (const exportName of data.reexportNamespace) {
exportNames.push(exportName);
}
}
initStatements.push(
...chunk(exportNames, 100).map(members => {
return buildInitStatement(
metadata,
members,
programPath.scope.buildUndefinedNode(),
);
}),
);
return initStatements;
}
const initStatement = template(`
EXPORTS.NAME = VALUE;
`);
/**
* Given a set of export names, create a set of nested assignments to
* initialize them all to a given expression.
*/
function buildInitStatement(metadata, exportNames, initExpr) {
return t.expressionStatement(
exportNames.reduce((acc, exportName) => {
return initStatement({
EXPORTS: t.identifier(metadata.exportName),
NAME: t.identifier(exportName),
VALUE: acc,
}).expression;
}, initExpr),
);
}

View File

@ -0,0 +1,413 @@
import { basename, extname } from "path";
import * as t from "babel-types";
export type ModuleMetadata = {
exportName: string,
// Lookup from local binding to export information.
local: Map<string, LocalExportMetadata>,
// Lookup of source file to source file metadata.
source: Map<string, SourceModuleMetadata>,
};
export type InteropType = "default" | "namespace" | "none";
export type SourceModuleMetadata = {
// A unique variable name to use for this namespace object. Centralized for simplicity.
name: string,
loc: ?BabelNodeSourceLocation,
interop: InteropType,
// Local binding to reference from this source namespace. Key: Local name, value: Import name
imports: Map<string, string>,
// Local names that reference namespace object.
importsNamespace: Set<string>,
// Reexports to create for namespace. Key: Export name, value: Import name
reexports: Map<string, string>,
// List of names to re-export namespace as.
reexportNamespace: Set<string>,
// Tracks if the source should be re-exported.
reexportAll: null | {
loc: ?BabelNodeSourceLocation,
},
};
export type LocalExportMetadata = {
name: Array<string>, // names of exports
kind: "import" | "hoisted" | "block" | "var",
};
/**
* Check if the module has any exports that need handling.
*/
export function hasExports(metadata: ModuleMetadata) {
const { local, source } = metadata;
return (
local.size > 0 ||
Array.from(source).some(([, meta]) => {
return (
meta.reexports.size > 0 ||
meta.reexportNamespace.size > 0 ||
!!meta.reexportAll
);
})
);
}
/**
* Check if a given source is an anonymous import, e.g. "import 'foo';"
*/
export function isSideEffectImport(source: SourceModuleMetadata) {
return (
source.imports.size === 0 &&
source.importsNamespace.size === 0 &&
source.reexports.size === 0 &&
source.reexportNamespace.size === 0 &&
!source.reexportAll
);
}
/**
* Remove all imports and exports from the file, and return all metadata
* needed to reconstruct the module's behavior.
*/
export default function normalizeModuleAndLoadMetadata(
programPath: NodePath,
exportName?: string,
{ strict = false, noInterop = false } = {},
): ModuleMetadata {
if (!exportName) {
exportName = programPath.scope.generateUidIdentifier("exports").name;
}
nameAnonymousExports(programPath);
const { local, source } = getModuleMetadata(programPath, strict);
removeModuleDeclarations(programPath);
// Reuse the imported namespace name if there is one.
for (const [, metadata] of source) {
if (metadata.importsNamespace.size > 0) {
// This is kind of gross. If we stop using `loose: true` we should
// just make this destructuring assignment.
metadata.name = metadata.importsNamespace.values().next().value;
}
if (noInterop) metadata.interop = "none";
}
return {
exportName,
local,
source,
};
}
/**
* Get metadata about the imports and exports present in this module.
*/
function getModuleMetadata(programPath: NodePath, strict: boolean = false) {
const localData = getLocalExportMetadata(programPath);
const sourceData = new Map();
const getData = sourceNode => {
const source = sourceNode.value;
let data = sourceData.get(source);
if (!data) {
data = {
name: programPath.scope.generateUidIdentifier(
basename(source, extname(source)),
).name,
interop: "none",
loc: null,
// Data about the requested sources and names.
imports: new Map(),
importsNamespace: new Set(),
// Metadata about data that is passed directly from source to export.
reexports: new Map(),
reexportNamespace: new Set(),
reexportAll: null,
};
sourceData.set(source, data);
}
return data;
};
programPath.get("body").forEach(child => {
if (child.isImportDeclaration()) {
const data = getData(child.node.source);
if (!data.loc) data.loc = child.node.loc;
child.get("specifiers").forEach(spec => {
if (spec.isImportDefaultSpecifier()) {
if (data.interop === "none") data.interop = "default";
const localName = spec.get("local").node.name;
data.imports.set(localName, "default");
const reexport = localData.get(localName);
if (reexport) {
localData.delete(localName);
reexport.names.forEach(name => {
data.reexports.set(name, "default");
});
}
} else if (spec.isImportNamespaceSpecifier()) {
const localName = spec.get("local").node.name;
if (!strict) data.interop = "namespace";
data.importsNamespace.add(localName);
const reexport = localData.get(localName);
if (reexport) {
localData.delete(localName);
reexport.names.forEach(name => {
data.reexportNamespace.add(name);
});
}
} else if (spec.isImportSpecifier()) {
const importName = spec.get("imported").node.name;
const localName = spec.get("local").node.name;
data.imports.set(localName, importName);
if (importName === "default" && data.interop === "none") {
data.interop = "default";
}
const reexport = localData.get(localName);
if (reexport) {
localData.delete(localName);
reexport.names.forEach(name => {
data.reexports.set(name, importName);
});
}
}
});
} else if (child.isExportAllDeclaration()) {
const data = getData(child.node.source);
if (!data.loc) data.loc = child.node.loc;
data.reexportAll = {
loc: child.node.loc,
};
} else if (child.isExportNamedDeclaration() && child.node.source) {
const data = getData(child.node.source);
if (!data.loc) data.loc = child.node.loc;
child.get("specifiers").forEach(spec => {
if (!spec.isExportSpecifier()) {
throw spec.buildCodeFrameError("Unexpected export specifier type");
}
const importName = spec.get("local").node.name;
const exportName = spec.get("exported").node.name;
if (importName === "default" && data.interop === "none") {
data.interop = "default";
}
data.reexports.set(exportName, importName);
if (exportName === "__esModule") {
throw exportName.buildCodeFrameError('Illegal export "__esModule".');
}
});
}
});
return {
local: localData,
source: sourceData,
};
}
/**
* Get metadata about local variables that are exported.
*/
function getLocalExportMetadata(
programPath: NodePath,
): Map<string, LocalExportMetadata> {
const bindingKindLookup = new Map();
programPath.get("body").forEach(child => {
let kind;
if (child.isImportDeclaration()) {
kind = "import";
} else {
if (child.isExportDefaultDeclaration()) child = child.get("declaration");
if (child.isExportNamedDeclaration() && child.node.declaration) {
child = child.get("declaration");
}
if (child.isFunctionDeclaration()) {
kind = "hoisted";
} else if (child.isClassDeclaration()) {
kind = "block";
} else if (child.isVariableDeclaration({ kind: "var" })) {
kind = "var";
} else if (child.isVariableDeclaration()) {
kind = "block";
} else {
return;
}
}
Object.keys(child.getOuterBindingIdentifiers()).forEach(name => {
bindingKindLookup.set(name, kind);
});
});
const localMetadata = new Map();
const getLocalMetadata = idPath => {
const localName = idPath.node.name;
let metadata = localMetadata.get(localName);
if (!metadata) {
const kind = bindingKindLookup.get(localName);
if (kind === undefined) {
throw idPath.buildCodeFrameError(
`Exporting local "${localName}", which is not declared.`,
);
}
metadata = {
names: [],
kind,
};
localMetadata.set(localName, metadata);
}
return metadata;
};
programPath.get("body").forEach(child => {
if (child.isExportNamedDeclaration() && !child.node.source) {
if (child.node.declaration) {
const declaration = child.get("declaration");
const ids = declaration.getOuterBindingIdentifierPaths();
Object.keys(ids).forEach(name => {
if (name === "__esModule") {
throw declaration.buildCodeFrameError(
'Illegal export "__esModule".',
);
}
getLocalMetadata(ids[name]).names.push(name);
});
} else {
child.get("specifiers").forEach(spec => {
const local = spec.get("local");
const exported = spec.get("exported");
if (exported.node.name === "__esModule") {
throw exported.buildCodeFrameError('Illegal export "__esModule".');
}
getLocalMetadata(local).names.push(exported.node.name);
});
}
} else if (child.isExportDefaultDeclaration()) {
const declaration = child.get("declaration");
if (
declaration.isFunctionDeclaration() ||
declaration.isClassDeclaration()
) {
getLocalMetadata(declaration.get("id")).names.push("default");
} else {
// These should have been removed by the nameAnonymousExports() call.
throw declaration.buildCodeFrameError(
"Unexpected default expression export.",
);
}
}
});
return localMetadata;
}
/**
* Ensure that all exported values have local binding names.
*/
function nameAnonymousExports(programPath: NodePath) {
// Name anonymous exported locals.
programPath.get("body").forEach(child => {
if (!child.isExportDefaultDeclaration()) return;
// export default foo;
const declaration = child.get("declaration");
if (declaration.isFunctionDeclaration()) {
if (!declaration.node.id) {
declaration.node.id = declaration.scope.generateUidIdentifier(
"default",
);
}
} else if (declaration.isClassDeclaration()) {
if (!declaration.node.id) {
declaration.node.id = declaration.scope.generateUidIdentifier(
"default",
);
}
} else {
const id = declaration.scope.generateUidIdentifier("default");
const namedDecl = t.exportNamedDeclaration(null, [
t.exportSpecifier(t.identifier(id.name), t.identifier("default")),
]);
namedDecl._blockHoist = child.node._blockHoist;
const varDecl = t.variableDeclaration("var", [
t.variableDeclarator(id, declaration.node),
]);
varDecl._blockHoist = child.node._blockHoist;
child.replaceWithMultiple([namedDecl, varDecl]);
}
});
}
function removeModuleDeclarations(programPath: NodePath) {
programPath.get("body").forEach(child => {
if (child.isImportDeclaration()) {
child.remove();
} else if (child.isExportNamedDeclaration()) {
if (child.node.declaration) {
child.node.declaration._blockHoist = child.node._blockHoist;
child.replaceWith(child.node.declaration);
} else {
child.remove();
}
} else if (child.isExportDefaultDeclaration()) {
// export default foo;
const declaration = child.get("declaration");
if (
declaration.isFunctionDeclaration() ||
declaration.isClassDeclaration()
) {
declaration._blockHoist = child.node._blockHoist;
child.replaceWith(declaration);
} else {
// These should have been removed by the nameAnonymousExports() call.
throw declaration.buildCodeFrameError(
"Unexpected default expression export.",
);
}
} else if (child.isExportAllDeclaration()) {
child.remove();
}
});
}

View File

@ -0,0 +1,349 @@
import * as t from "babel-types";
import template from "babel-template";
import type { ModuleMetadata } from "./";
export default function rewriteLiveReferences(
programPath: NodePath,
metadata: ModuleMetadata,
) {
const imported = new Map();
const exported = new Map();
const requeueInParent = path => {
// Manualy re-queue `exports.default =` expressions so that the ES3
// transform has an opportunity to convert them. Ideally this would
// happen automatically from the replaceWith above. See #4140 for
// more info.
programPath.requeue(path);
};
for (const [source, data] of metadata.source) {
for (const [localName, importName] of data.imports) {
imported.set(localName, [source, importName, null]);
}
for (const localName of data.importsNamespace) {
imported.set(localName, [null, null, localName]);
}
}
for (const [local, data] of metadata.local) {
let exportMeta = exported.get(local);
if (!exportMeta) {
exportMeta = [];
exported.set(local, exportMeta);
}
exportMeta.push(...data.names);
}
// Rewrite inititialization of bindings to update exports.
programPath.traverse(rewriteBindingInitVisitor, {
metadata,
requeueInParent,
scope: programPath.scope,
exported, // local name => exported name list
});
// Rewrite reads/writes from imports and exports to have the correct behavior.
programPath.traverse(rewriteReferencesVisitor, {
seen: new WeakSet(),
metadata,
requeueInParent,
scope: programPath.scope,
imported, // local / import
exported, // local name => exported name list
buildImportReference: ([source, importName, localName]) => {
if (localName) return null;
const name = metadata.source.get(source).name;
return t.memberExpression(t.identifier(name), t.identifier(importName));
},
});
}
/**
* A visitor to inject export update statements during binding initialization.
*/
const rewriteBindingInitVisitor = {
ClassProperty(path) {
path.skip();
},
Function(path) {
path.skip();
},
ClassDeclaration(path) {
const { requeueInParent, exported, metadata } = this;
const { id } = path.node;
if (!id) throw new Error("Expected class to have a name");
const localName = id.name;
const exportNames = exported.get(localName) || [];
if (exportNames.length > 0) {
const statement = t.expressionStatement(
buildBindingExportAssignmentExpression(
metadata,
exportNames,
t.identifier(localName),
),
);
requeueInParent(path.insertAfter(statement)[0]);
}
},
VariableDeclaration(path) {
const { requeueInParent, exported, metadata } = this;
Object.keys(path.getOuterBindingIdentifiers()).forEach(localName => {
const exportNames = exported.get(localName) || [];
if (exportNames.length > 0) {
const statement = t.expressionStatement(
buildBindingExportAssignmentExpression(
metadata,
exportNames,
t.identifier(localName),
),
);
requeueInParent(path.insertAfter(statement)[0]);
}
});
},
};
const buildBindingExportAssignmentExpression = (
metadata,
exportNames,
localExpr,
) => {
return (exportNames || []).reduce((expr, exportName) => {
// class Foo {} export { Foo, Foo as Bar };
// as
// class Foo {} exports.Foo = exports.Bar = Foo;
return t.assignmentExpression(
"=",
t.memberExpression(
t.identifier(metadata.exportName),
t.identifier(exportName),
),
expr,
);
}, localExpr);
};
const importThrow = template(`
(function() {
throw new Error('"' + NAME + '" is read-only.');
})();
`);
const buildImportThrow = localName => {
return importThrow({
NAME: t.stringLiteral(localName),
}).expression;
};
const rewriteReferencesVisitor = {
ReferencedIdentifier(path) {
const {
seen,
buildImportReference,
scope,
imported,
requeueInParent,
} = this;
if (seen.has(path.node)) return;
seen.add(path.node);
const localName = path.node.name;
const localBinding = path.scope.getBinding(localName);
const rootBinding = scope.getBinding(localName);
// redeclared in this scope
if (rootBinding !== localBinding) return;
const importData = imported.get(localName);
if (importData) {
const ref = buildImportReference(importData) || path.node;
if (path.parentPath.isCallExpression({ callee: path.node })) {
path.replaceWith(t.sequenceExpression([t.numericLiteral(0), ref]));
} else if (path.isJSXIdentifier() && t.isMemberExpression(ref)) {
const { object, property } = ref;
path.replaceWith(
t.JSXMemberExpression(
t.JSXIdentifier(object.name),
t.JSXIdentifier(property.name),
),
);
} else {
path.replaceWith(ref);
}
requeueInParent(path);
}
},
UpdateExpression: {
exit(path) {
const { scope, imported, exported } = this;
const arg = path.get("argument");
if (!arg.isIdentifier()) return;
const localName = arg.node.name;
if (!imported.has(localName) && !exported.has(localName)) {
return;
}
// redeclared in this scope
if (scope.getBinding(localName) !== path.scope.getBinding(localName)) {
return;
}
const exportedNames = exported.get(localName) || [];
if (exportedNames.length > 0 || imported.has(localName)) {
if (
path.node.prefix ||
(path.parentPath.isExpressionStatement() &&
!path.isCompletionRecord())
) {
// ++i => (i += 1);
path.replaceWith(
t.assignmentExpression("+=", arg.node, t.numericLiteral(1)),
);
} else {
const varName = path.scope.generateDeclaredUidIdentifier("old");
const assignment = t.binaryExpression(
path.node.operator.slice(0, 1),
varName,
t.numericLiteral(1),
);
// i++ => (_tmp = i, i = _tmp + 1, _tmp)
path.replaceWith(
t.sequenceExpression([
t.assignmentExpression("=", varName, arg.node),
t.assignmentExpression("=", arg.node, assignment),
varName,
]),
);
}
}
},
},
AssignmentExpression: {
exit(path) {
const {
scope,
seen,
imported,
exported,
requeueInParent,
buildImportReference,
} = this;
if (seen.has(path.node)) return;
seen.add(path.node);
const left = path.get("left");
if (left.isIdentifier()) {
// Simple update-assign foo += 1; export { foo };
// => exports.foo = (foo += 1);
const localName = left.node.name;
// redeclared in this scope
if (scope.getBinding(localName) !== path.scope.getBinding(localName)) {
return;
}
const exportedNames = exported.get(localName) || [];
const importData = imported.get(localName);
if (exportedNames.length > 0 || importData) {
const assignment = path.node;
if (importData) {
assignment.left =
buildImportReference(importData) || assignment.left;
if (path.node.operator !== "=") {
const op = path.node.operator.slice(0, -1);
path.node.operator = "=";
assignment.right = t.binaryExpression(
op,
assignment.left,
assignment.right,
);
}
assignment.right = t.sequenceExpression([
assignment.right,
buildImportThrow(localName),
]);
}
path.replaceWith(
buildBindingExportAssignmentExpression(
this.metadata,
exportedNames,
assignment,
),
);
requeueInParent(path);
}
} else if (left.isMemberExpression()) {
// No change needed
} else {
const ids = left.getOuterBindingIdentifiers();
const id = Object.keys(ids)
.filter(localName => imported.has(localName))
.pop();
if (id) {
path.node.right = t.sequenceExpression([
path.node.right,
buildImportThrow(id),
]);
}
// Complex ({a, b, c} = {}); export { a, c };
// => ({a, b, c} = {}), (exports.a = a, exports.c = c);
const items = [];
Object.keys(ids).forEach(localName => {
// redeclared in this scope
if (
scope.getBinding(localName) !== path.scope.getBinding(localName)
) {
return;
}
const exportedNames = exported.get(localName) || [];
if (exportedNames.length > 0) {
items.push(
buildBindingExportAssignmentExpression(
this.metadata,
exportedNames,
t.identifier(localName),
),
);
}
});
if (items.length > 0) {
let node = t.sequenceExpression(items);
if (path.parentPath.isExpressionStatement()) {
node = t.expressionStatement(node);
}
const statement = path.insertAfter(node)[0];
requeueInParent(statement);
}
}
},
},
};

View File

@ -0,0 +1,20 @@
export default function rewriteThis(programPath: NodePath) {
// Rewrite "this" to be "undefined".
programPath.traverse(rewriteThisVisitor);
}
/**
* A visitor to walk the tree, rewriting all `this` references in the top-level scope to be
* `undefined`.
*/
const rewriteThisVisitor = {
ThisExpression(path) {
path.replaceWith(path.scope.buildUndefinedNode());
},
Function(path) {
if (!path.isArrowFunctionExpression()) path.skip();
},
ClassProperty(path) {
path.skip();
},
};

View File

@ -18,7 +18,7 @@ export default function({ messages, types: t }) {
Scope({ scope }) {
for (const name in scope.bindings) {
const binding = scope.bindings[name];
if (binding.kind !== "const" && binding.kind !== "module") continue;
if (binding.kind !== "const") continue;
for (const violation of (binding.constantViolations: Array)) {
const throwNode = t.throwStatement(

View File

@ -10,18 +10,21 @@
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
exports.default = function (_a) {
var _default = function _default(_a) {
return {
a: function a() {
return _a;
}
};
};
_exports.default = _default;
});

View File

@ -79,6 +79,7 @@ export default function({ types: t }) {
const source = init.node.arguments[0];
this.sourceNames[source.value] = true;
this.sources.push([id.node, source]);
path.remove();

View File

@ -6,7 +6,7 @@
"license": "MIT",
"main": "lib/index.js",
"dependencies": {
"babel-plugin-transform-es2015-modules-amd": "7.0.0-beta.0",
"babel-helper-modules": "7.0.0-beta.0",
"babel-template": "7.0.0-beta.0"
},
"keywords": [

View File

@ -1,155 +1,216 @@
import { basename, extname } from "path";
import template from "babel-template";
import transformAMD from "babel-plugin-transform-es2015-modules-amd";
import {
rewriteModuleStatementsAndPrepareHeader,
hasExports,
getSourceMetadataArray,
buildNamespaceInitStatements,
ensureStatementsHoisted,
wrapInterop,
} from "babel-helper-modules";
const buildPrerequisiteAssignment = template(`
GLOBAL_REFERENCE = GLOBAL_REFERENCE || {}
`);
const buildGlobalExport = template(`
var mod = { exports: {} };
factory(BROWSER_ARGUMENTS);
PREREQUISITE_ASSIGNMENTS
GLOBAL_TO_ASSIGN = mod.exports;
`);
const buildWrapper = template(`
(function (global, factory) {
if (typeof define === "function" && define.amd) {
define(MODULE_NAME, AMD_ARGUMENTS, factory);
} else if (typeof exports !== "undefined") {
factory(COMMON_ARGUMENTS);
factory(COMMONJS_ARGUMENTS);
} else {
GLOBAL_EXPORT
var mod = { exports: {} };
factory(BROWSER_ARGUMENTS);
GLOBAL_TO_ASSIGN;
}
})(this, FUNC);
})(this, function(IMPORT_NAMES) {
})
`);
export default function({ types: t }) {
function isValidDefine(path) {
if (!path.isExpressionStatement()) return;
/**
* Build the assignment statements that initialize the UMD global.
*/
function buildBrowserInit(browserGlobals, exactGlobals, file, moduleName) {
const moduleNameOrBasename = moduleName
? moduleName.value
: basename(file.opts.filename, extname(file.opts.filename));
let globalToAssign = t.memberExpression(
t.identifier("global"),
t.identifier(t.toIdentifier(moduleNameOrBasename)),
);
let initAssignments = [];
const expr = path.get("expression");
if (!expr.isCallExpression()) return false;
if (!expr.get("callee").isIdentifier({ name: "define" })) return false;
if (exactGlobals) {
const globalName = browserGlobals[moduleNameOrBasename];
const args = expr.get("arguments");
if (args.length === 3 && !args.shift().isStringLiteral()) return false;
if (args.length !== 2) return false;
if (!args.shift().isArrayExpression()) return false;
if (!args.shift().isFunctionExpression()) return false;
if (globalName) {
initAssignments = [];
return true;
const members = globalName.split(".");
globalToAssign = members.slice(1).reduce((accum, curr) => {
initAssignments.push(
buildPrerequisiteAssignment({ GLOBAL_REFERENCE: accum }),
);
return t.memberExpression(accum, t.identifier(curr));
}, t.memberExpression(t.identifier("global"), t.identifier(members[0])));
}
}
initAssignments.push(
t.expressionStatement(
t.assignmentExpression(
"=",
globalToAssign,
t.memberExpression(t.identifier("mod"), t.identifier("exports")),
),
),
);
return initAssignments;
}
/**
* Build the member expression that reads from a global for a given source.
*/
function buildBrowserArg(browserGlobals, exactGlobals, source) {
let memberExpression;
if (exactGlobals) {
const globalRef = browserGlobals[source];
if (globalRef) {
memberExpression = globalRef
.split(".")
.reduce(
(accum, curr) => t.memberExpression(accum, t.identifier(curr)),
t.identifier("global"),
);
} else {
memberExpression = t.memberExpression(
t.identifier("global"),
t.identifier(t.toIdentifier(source)),
);
}
} else {
const requireName = basename(source, extname(source));
const globalName = browserGlobals[requireName] || requireName;
memberExpression = t.memberExpression(
t.identifier("global"),
t.identifier(t.toIdentifier(globalName)),
);
}
return memberExpression;
}
return {
inherits: transformAMD,
visitor: {
Program: {
exit(path, state) {
const last = path.get("body").pop();
if (!isValidDefine(last)) return;
const {
globals,
exactGlobals,
loose,
allowTopLevelThis,
strict,
strictMode,
noInterop,
} = state.opts;
const browserGlobals = globals || {};
const call = last.node.expression;
const args = call.arguments;
let moduleName = this.getModuleName();
if (moduleName) moduleName = t.stringLiteral(moduleName);
const moduleName = args.length === 3 ? args.shift() : null;
const amdArgs = call.arguments[0];
const func = call.arguments[1];
const browserGlobals = state.opts.globals || {};
const commonArgs = amdArgs.elements.map(arg => {
if (arg.value === "module" || arg.value === "exports") {
return t.identifier(arg.value);
} else {
return t.callExpression(t.identifier("require"), [arg]);
}
const {
meta,
headers,
} = rewriteModuleStatementsAndPrepareHeader(path, {
loose,
strict,
strictMode,
allowTopLevelThis,
noInterop,
});
const browserArgs = amdArgs.elements.map(arg => {
if (arg.value === "module") {
return t.identifier("mod");
} else if (arg.value === "exports") {
return t.memberExpression(
t.identifier("mod"),
t.identifier("exports"),
);
} else {
let memberExpression;
const amdArgs = [];
const commonjsArgs = [];
const browserArgs = [];
const importNames = [];
if (state.opts.exactGlobals) {
const globalRef = browserGlobals[arg.value];
if (globalRef) {
memberExpression = globalRef
.split(".")
.reduce(
(accum, curr) =>
t.memberExpression(accum, t.identifier(curr)),
t.identifier("global"),
);
} else {
memberExpression = t.memberExpression(
t.identifier("global"),
t.identifier(t.toIdentifier(arg.value)),
);
}
} else {
const requireName = basename(arg.value, extname(arg.value));
const globalName = browserGlobals[requireName] || requireName;
memberExpression = t.memberExpression(
t.identifier("global"),
t.identifier(t.toIdentifier(globalName)),
);
}
return memberExpression;
}
});
const moduleNameOrBasename = moduleName
? moduleName.value
: basename(
this.file.opts.filename,
extname(this.file.opts.filename),
);
let globalToAssign = t.memberExpression(
t.identifier("global"),
t.identifier(t.toIdentifier(moduleNameOrBasename)),
);
let prerequisiteAssignments = null;
if (state.opts.exactGlobals) {
const globalName = browserGlobals[moduleNameOrBasename];
if (globalName) {
prerequisiteAssignments = [];
const members = globalName.split(".");
globalToAssign = members.slice(1).reduce((accum, curr) => {
prerequisiteAssignments.push(
buildPrerequisiteAssignment({ GLOBAL_REFERENCE: accum }),
);
return t.memberExpression(accum, t.identifier(curr));
}, t.memberExpression(t.identifier("global"), t.identifier(members[0])));
}
if (hasExports(meta)) {
amdArgs.push(t.stringLiteral("exports"));
commonjsArgs.push(t.identifier("exports"));
browserArgs.push(
t.memberExpression(t.identifier("mod"), t.identifier("exports")),
);
importNames.push(t.identifier(meta.exportName));
}
const globalExport = buildGlobalExport({
BROWSER_ARGUMENTS: browserArgs,
PREREQUISITE_ASSIGNMENTS: prerequisiteAssignments,
GLOBAL_TO_ASSIGN: globalToAssign,
getSourceMetadataArray(
meta,
).forEach(([source, metadata, , inSideEffectBlock]) => {
amdArgs.push(t.stringLiteral(source));
commonjsArgs.push(
t.callExpression(t.identifier("require"), [
t.stringLiteral(source),
]),
);
browserArgs.push(
buildBrowserArg(browserGlobals, exactGlobals, source),
);
if (!inSideEffectBlock) {
importNames.push(t.identifier(metadata.name));
const interop = wrapInterop(
path,
t.identifier(metadata.name),
metadata.interop,
);
if (interop) {
const header = t.expressionStatement(
t.assignmentExpression(
"=",
t.identifier(metadata.name),
interop,
),
);
header.loc = meta.loc;
headers.push(header);
}
}
headers.push(...buildNamespaceInitStatements(meta, metadata));
});
last.replaceWith(
ensureStatementsHoisted(headers);
path.unshiftContainer("body", headers);
const { body, directives } = path.node;
path.node.directives = [];
path.node.body = [];
const umdWrapper = path.pushContainer("body", [
buildWrapper({
MODULE_NAME: moduleName,
AMD_ARGUMENTS: amdArgs,
COMMON_ARGUMENTS: commonArgs,
GLOBAL_EXPORT: globalExport,
FUNC: func,
AMD_ARGUMENTS: t.arrayExpression(amdArgs),
COMMONJS_ARGUMENTS: commonjsArgs,
BROWSER_ARGUMENTS: browserArgs,
IMPORT_NAMES: importNames,
GLOBAL_TO_ASSIGN: buildBrowserInit(
browserGlobals,
exactGlobals,
this.file,
moduleName,
),
}),
);
])[0];
const umdFactory = umdWrapper
.get("expression.arguments")[1]
.get("body");
umdFactory.pushContainer("directives", directives);
umdFactory.pushContainer("body", body);
},
},
},

View File

@ -10,12 +10,13 @@
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports["default"] = _default;
exports["default"] = function () {};
function _default() {}
});

View File

@ -10,14 +10,17 @@
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
exports.default = function () {
var _default = function () {
return "foo";
}();
_exports.default = _default;
});

View File

@ -10,14 +10,18 @@
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.Cachier = Cachier;
exports.default = new Cachier();
_exports.Cachier = Cachier;
_exports.default = void 0;
var _default = new Cachier();
_exports.default = _default;
function Cachier(databaseName) {}
});

View File

@ -10,11 +10,13 @@
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.default = {};
_exports.default = void 0;
var _default = {};
_exports.default = _default;
});

View File

@ -10,11 +10,13 @@
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.default = [];
_exports.default = void 0;
var _default = [];
_exports.default = _default;
});

View File

@ -10,11 +10,13 @@
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.default = foo;
_exports.default = void 0;
var _default = foo;
_exports.default = _default;
});

View File

@ -10,12 +10,13 @@
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = _default;
exports.default = function () {};
function _default() {}
});

View File

@ -10,11 +10,15 @@
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.default = class {};
_exports.default = void 0;
class _default {}
_exports.default = _default;
});

View File

@ -10,13 +10,13 @@
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.default = foo;
_exports.default = foo;
function foo() {}
});

View File

@ -10,14 +10,15 @@
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
class Foo {}
exports.default = Foo;
_exports.default = Foo;
});

View File

@ -1,2 +1,3 @@
var foo;
export { foo as default };

View File

@ -10,11 +10,13 @@
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.default = foo;
_exports.default = void 0;
var foo;
_exports.default = foo;
});

View File

@ -10,11 +10,13 @@
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.default = 42;
_exports.default = void 0;
var _default = 42;
_exports.default = _default;
});

View File

@ -10,13 +10,13 @@
factory(mod.exports, global.foo);
global.actual = mod.exports;
}
})(this, function (exports, _foo) {
})(this, function (_exports, _foo) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "default", {
Object.defineProperty(_exports, "default", {
enumerable: true,
get: function () {
return _foo.foo;

View File

@ -10,19 +10,19 @@
factory(mod.exports, global.foo);
global.actual = mod.exports;
}
})(this, function (exports, _foo) {
})(this, function (_exports, _foo) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "default", {
Object.defineProperty(_exports, "default", {
enumerable: true,
get: function () {
return _foo.foo;
}
});
Object.defineProperty(exports, "bar", {
Object.defineProperty(_exports, "bar", {
enumerable: true,
get: function () {
return _foo.bar;

View File

@ -10,13 +10,13 @@
factory(mod.exports, global.foo);
global.actual = mod.exports;
}
})(this, function (exports, _foo) {
})(this, function (_exports, _foo) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "bar", {
Object.defineProperty(_exports, "bar", {
enumerable: true,
get: function () {
return _foo.foo;

View File

@ -10,19 +10,19 @@
factory(mod.exports, global.foo);
global.actual = mod.exports;
}
})(this, function (exports, _foo) {
})(this, function (_exports, _foo) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "foo", {
Object.defineProperty(_exports, "foo", {
enumerable: true,
get: function () {
return _foo.foo;
}
});
Object.defineProperty(exports, "bar", {
Object.defineProperty(_exports, "bar", {
enumerable: true,
get: function () {
return _foo.bar;

View File

@ -10,15 +10,15 @@
factory(mod.exports, global.foo);
global.actual = mod.exports;
}
})(this, function (exports, _foo) {
})(this, function (_exports, _foo) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
Object.keys(_foo).forEach(function (key) {
if (key === "default" || key === "__esModule") return;
Object.defineProperty(exports, key, {
Object.defineProperty(_exports, key, {
enumerable: true,
get: function () {
return _foo[key];

View File

@ -10,13 +10,13 @@
factory(mod.exports, global.foo);
global.actual = mod.exports;
}
})(this, function (exports, _foo) {
})(this, function (_exports, _foo) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "foo", {
Object.defineProperty(_exports, "foo", {
enumerable: true,
get: function () {
return _foo.foo;

View File

@ -1 +1,2 @@
var foo;
export {foo as default};

View File

@ -10,11 +10,13 @@
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.default = foo;
_exports.default = void 0;
var foo;
_exports.default = foo;
});

View File

@ -1 +1,2 @@
var foo, bar;
export {foo as default, bar};

View File

@ -10,12 +10,14 @@
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.default = foo;
exports.bar = bar;
_exports.bar = _exports.default = void 0;
var foo, bar;
_exports.bar = bar;
_exports.default = foo;
});

View File

@ -1 +1,2 @@
var foo;
export {foo as bar};

View File

@ -10,11 +10,13 @@
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.bar = foo;
_exports.bar = void 0;
var foo;
_exports.bar = foo;
});

View File

@ -1 +1,2 @@
var foo, bar;
export {foo, bar};

View File

@ -10,12 +10,14 @@
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.foo = foo;
exports.bar = bar;
_exports.bar = _exports.foo = void 0;
var foo, bar;
_exports.bar = bar;
_exports.foo = foo;
});

View File

@ -10,11 +10,13 @@
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.foo = foo;
_exports.foo = void 0;
var foo;
_exports.foo = foo;
});

View File

@ -10,27 +10,36 @@
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.foo8 = foo8;
var foo = exports.foo = 1;
var foo2 = exports.foo2 = 1,
bar = exports.bar = 2;
_exports.foo8 = foo8;
_exports.foo9 = _exports.foo7 = _exports.foo6 = _exports.foo5 = _exports.foo4 = _exports.foo3 = _exports.bar = _exports.foo2 = _exports.foo = void 0;
var foo = 1;
_exports.foo = foo;
var foo2 = 1,
bar = 2;
_exports.bar = bar;
_exports.foo2 = foo2;
var foo3 = exports.foo3 = function () {};
var foo3 = function () {};
var foo4 = exports.foo4 = void 0;
let foo5 = exports.foo5 = 2;
let foo6 = exports.foo6 = void 0;
const foo7 = exports.foo7 = 3;
_exports.foo3 = foo3;
var foo4;
_exports.foo4 = foo4;
let foo5 = 2;
_exports.foo5 = foo5;
let foo6;
_exports.foo6 = foo6;
const foo7 = 3;
_exports.foo7 = foo7;
function foo8() {}
class foo9 {}
exports.foo9 = foo9;
_exports.foo9 = foo9;
});

View File

@ -10,22 +10,24 @@
factory(mod.exports, global.evens);
global.actual = mod.exports;
}
})(this, function (exports, _evens) {
})(this, function (_exports, _evens) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.isOdd = void 0;
exports.nextOdd = nextOdd;
_exports.nextOdd = nextOdd;
_exports.isOdd = void 0;
function nextOdd(n) {
return (0, _evens.isEven)(n) ? n + 1 : n + 2;
}
var isOdd = exports.isOdd = function (isEven) {
var isOdd = function (isEven) {
return function (n) {
return !isEven(n);
};
}(_evens.isEven);
_exports.isOdd = isOdd;
});

View File

@ -13,8 +13,7 @@
})(this, function (_foo) {
"use strict";
var _foo2 = babelHelpers.interopRequireDefault(_foo);
_foo2.default;
_foo2.default;
_foo = babelHelpers.interopRequireDefault(_foo);
_foo.default;
_foo.default;
});

View File

@ -10,12 +10,10 @@
factory(global.fooBAR, global.fooBAR, global.fizzBuzz);
global.actual = mod.exports;
}
})(this, function (_fooBar, _fooBar3, _fizzbuzz) {
})(this, function (_fooBar, _fooBar2, _fizzbuzz) {
"use strict";
var _fooBar2 = babelHelpers.interopRequireDefault(_fooBar);
var _fooBar4 = babelHelpers.interopRequireDefault(_fooBar3);
var _fizzbuzz2 = babelHelpers.interopRequireDefault(_fizzbuzz);
_fooBar = babelHelpers.interopRequireDefault(_fooBar);
_fooBar2 = babelHelpers.interopRequireDefault(_fooBar2);
_fizzbuzz = babelHelpers.interopRequireDefault(_fizzbuzz);
});

View File

@ -10,12 +10,10 @@
factory(global.fooBar, global.fooBar, global.fizzbuzz);
global.actual = mod.exports;
}
})(this, function (_fooBar, _fooBar3, _fizzbuzz) {
})(this, function (_fooBar, _fooBar2, _fizzbuzz) {
"use strict";
var _fooBar2 = babelHelpers.interopRequireDefault(_fooBar);
var _fooBar4 = babelHelpers.interopRequireDefault(_fooBar3);
var _fizzbuzz2 = babelHelpers.interopRequireDefault(_fizzbuzz);
_fooBar = babelHelpers.interopRequireDefault(_fooBar);
_fooBar2 = babelHelpers.interopRequireDefault(_fooBar2);
_fizzbuzz = babelHelpers.interopRequireDefault(_fizzbuzz);
});

View File

@ -10,12 +10,10 @@
factory(global.fooBAR, global.mylib.fooBar, global.fizz.buzz);
global.actual = mod.exports;
}
})(this, function (_fooBar, _fooBar3, _fizzbuzz) {
})(this, function (_fooBar, _fooBar2, _fizzbuzz) {
"use strict";
var _fooBar2 = babelHelpers.interopRequireDefault(_fooBar);
var _fooBar4 = babelHelpers.interopRequireDefault(_fooBar3);
var _fizzbuzz2 = babelHelpers.interopRequireDefault(_fizzbuzz);
_fooBar = babelHelpers.interopRequireDefault(_fooBar);
_fooBar2 = babelHelpers.interopRequireDefault(_fooBar2);
_fizzbuzz = babelHelpers.interopRequireDefault(_fizzbuzz);
});

View File

@ -10,12 +10,10 @@
factory(global.fooBar, global.mylibFooBar, global.fizzbuzz);
global.actual = mod.exports;
}
})(this, function (_fooBar, _fooBar3, _fizzbuzz) {
})(this, function (_fooBar, _fooBar2, _fizzbuzz) {
"use strict";
var _fooBar2 = babelHelpers.interopRequireDefault(_fooBar);
var _fooBar4 = babelHelpers.interopRequireDefault(_fooBar3);
var _fizzbuzz2 = babelHelpers.interopRequireDefault(_fizzbuzz);
_fooBar = babelHelpers.interopRequireDefault(_fooBar);
_fooBar2 = babelHelpers.interopRequireDefault(_fooBar2);
_fizzbuzz = babelHelpers.interopRequireDefault(_fizzbuzz);
});

View File

@ -10,9 +10,9 @@
factory(global.foo);
global.actual = mod.exports;
}
})(this, function (_foo) {
})(this, function (foo) {
"use strict";
var foo = babelHelpers.interopRequireWildcard(_foo);
foo = babelHelpers.interopRequireWildcard(foo);
foo;
});

View File

@ -13,7 +13,6 @@
})(this, function (_foo) {
"use strict";
var _foo2 = babelHelpers.interopRequireDefault(_foo);
_foo = babelHelpers.interopRequireDefault(_foo);
_foo.baz;
});

View File

@ -11,11 +11,13 @@
global.foo = global.foo || {};
global.foo.bar = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.default = 42;
_exports.default = void 0;
var _default = 42;
_exports.default = _default;
});

View File

@ -13,11 +13,13 @@
global.foo.bar.baz = global.foo.bar.baz || {};
global.foo.bar.baz.qux = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.default = 42;
_exports.default = void 0;
var _default = 42;
_exports.default = _default;
});

View File

@ -10,11 +10,13 @@
factory(mod.exports);
global.baz = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.default = 42;
_exports.default = void 0;
var _default = 42;
_exports.default = _default;
});

View File

@ -10,11 +10,13 @@
factory(mod.exports);
global.baz = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.default = 42;
_exports.default = void 0;
var _default = 42;
_exports.default = _default;
});

View File

@ -10,11 +10,13 @@
factory(mod.exports);
global.baz = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.default = 42;
_exports.default = void 0;
var _default = 42;
_exports.default = _default;
});

View File

@ -6,6 +6,7 @@ import * as foo2 from "foo";
import {bar} from "foo";
import {foo as bar2} from "foo";
var test;
export {test};
export var test2 = 5;

View File

@ -10,17 +10,20 @@
factory(mod.exports, global.foo, global.fooBar, global.fooBar);
global.actual = mod.exports;
}
})(this, function (exports, _foo) {
})(this, function (_exports, foo2) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.test2 = exports.test = void 0;
var foo2 = babelHelpers.interopRequireWildcard(_foo);
exports.test = test;
var test2 = exports.test2 = 5;
exports.default = test;
_foo.bar;
_foo.foo;
_exports.default = _exports.test2 = _exports.test = void 0;
foo2 = babelHelpers.interopRequireWildcard(foo2);
var test;
_exports.test = test;
var test2 = 5;
_exports.test2 = test2;
var _default = test;
_exports.default = _default;
foo2.bar;
foo2.foo;
});

View File

@ -10,15 +10,17 @@
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
var test = exports.test = 2;
exports.test = test = 5;
exports.test = test += 1;
_exports.f = _exports.e = _exports.c = _exports.a = _exports.test = void 0;
var test = 2;
_exports.test = test;
_exports.test = test = 5;
_exports.test = test += 1;
(function () {
var test = 2;
@ -27,13 +29,12 @@
})();
var a = 2;
exports.a = a;
exports.a = a = 3;
_exports.a = a;
_exports.a = a = 3;
var b = 2;
exports.c = b;
exports.c = b = 3;
_exports.c = b;
_exports.c = b = 3;
var d = 3;
exports.e = d;
exports.f = d;
exports.f = exports.e = d = 4;
_exports.f = _exports.e = d;
_exports.f = _exports.e = d = 4;
});

View File

@ -10,13 +10,13 @@
factory(mod.exports);
global.actual = mod.exports;
}
})(this, function (exports) {
})(this, function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.a = a;
_exports.a = a;
function a() {}
});