Convert AMD to use new shared implementation.

This commit is contained in:
Logan Smyth
2017-09-07 20:41:00 -07:00
parent 95e08b6d2a
commit f17d30692c
43 changed files with 275 additions and 253 deletions

View File

@@ -1,15 +1,18 @@
define(["exports"], function (exports) {
define(["exports"], 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

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

View File

@@ -1,143 +1,111 @@
import { basename, extname } from "path";
import template from "babel-template";
import transformCommonjs from "babel-plugin-transform-es2015-modules-commonjs";
import {
rewriteModuleStatementsAndPrepareHeader,
hasExports,
getSourceMetadataArray,
buildNamespaceInitStatements,
ensureStatementsHoisted,
wrapInterop,
} from "babel-helper-modules";
const buildDefine = template(`
define(MODULE_NAME, [SOURCES], FACTORY);
`);
const buildFactory = template(`
(function (PARAMS) {
BODY;
const buildWrapper = template(`
define(MODULE_NAME, AMD_ARGUMENTS, function(IMPORT_NAMES) {
})
`);
export default function({ types: t }) {
function isValidRequireCall(path) {
if (!path.isCallExpression()) return false;
if (!path.get("callee").isIdentifier({ name: "require" })) return false;
if (path.scope.getBinding("require")) return false;
const args = path.get("arguments");
if (args.length !== 1) return false;
const arg = args[0];
if (!arg.isStringLiteral()) return false;
return true;
}
function buildParamsAndSource(sourcesFound) {
const params = [];
const sources = [];
let hasSeenNonBareRequire = false;
for (let i = sourcesFound.length - 1; i > -1; i--) {
const source = sourcesFound[i];
sources.unshift(source[1]);
// bare import at end, no need for param
if (!hasSeenNonBareRequire && source[2] === true) {
continue;
}
hasSeenNonBareRequire = true;
params.unshift(source[0]);
}
return [params, sources];
}
const amdVisitor = {
ReferencedIdentifier({ node, scope }) {
if (node.name === "exports" && !scope.getBinding("exports")) {
this.hasExports = true;
}
if (node.name === "module" && !scope.getBinding("module")) {
this.hasModule = true;
}
},
CallExpression(path) {
if (!isValidRequireCall(path)) return;
const source = path.node.arguments[0];
const ref = path.scope.generateUidIdentifier(
basename(source.value, extname(source.value)),
);
this.sources.push([ref, source, true]);
path.remove();
},
VariableDeclarator(path) {
const id = path.get("id");
if (!id.isIdentifier()) return;
const init = path.get("init");
if (!isValidRequireCall(init)) return;
const source = init.node.arguments[0];
this.sourceNames[source.value] = true;
this.sources.push([id.node, source]);
path.remove();
},
};
return {
inherits: transformCommonjs,
pre() {
// source strings
this.sources = [];
this.sourceNames = Object.create(null);
this.hasExports = false;
this.hasModule = false;
},
visitor: {
Program: {
exit(path) {
if (this.ran) return;
this.ran = true;
path.traverse(amdVisitor, this);
const [params, sources] = buildParamsAndSource(this.sources);
exit(path, state) {
const {
loose,
allowTopLevelThis,
strict,
strictMode,
noInterop,
} = state.opts;
let moduleName = this.getModuleName();
if (moduleName) moduleName = t.stringLiteral(moduleName);
if (this.hasExports) {
sources.unshift(t.stringLiteral("exports"));
params.unshift(t.identifier("exports"));
}
if (this.hasModule) {
sources.unshift(t.stringLiteral("module"));
params.unshift(t.identifier("module"));
}
const { node } = path;
const factory = buildFactory({
PARAMS: params,
BODY: node.body,
const {
meta,
headers,
} = rewriteModuleStatementsAndPrepareHeader(path, {
loose,
strict,
strictMode,
allowTopLevelThis,
noInterop,
});
factory.expression.body.directives = node.directives;
node.directives = [];
node.body = [];
const amdArgs = [];
const commonjsArgs = [];
const importNames = [];
path.pushContainer("body", [
buildDefine({
if (hasExports(meta)) {
amdArgs.push(t.stringLiteral("exports"));
commonjsArgs.push(t.identifier("exports"));
importNames.push(t.identifier(meta.exportName));
}
getSourceMetadataArray(
meta,
).forEach(([source, metadata, , inSideEffectBlock]) => {
amdArgs.push(t.stringLiteral(source));
commonjsArgs.push(
t.callExpression(t.identifier("require"), [
t.stringLiteral(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 = metadata.loc;
headers.push(header);
}
}
headers.push(...buildNamespaceInitStatements(meta, metadata));
});
ensureStatementsHoisted(headers);
path.unshiftContainer("body", headers);
const { body, directives } = path.node;
path.node.directives = [];
path.node.body = [];
const amdWrapper = path.pushContainer("body", [
buildWrapper({
MODULE_NAME: moduleName,
SOURCES: sources,
FACTORY: factory,
AMD_ARGUMENTS: t.arrayExpression(amdArgs),
COMMONJS_ARGUMENTS: commonjsArgs,
IMPORT_NAMES: importNames,
}),
]);
])[0];
const amdFactory = amdWrapper
.get("expression.arguments")
.filter(arg => arg.isFunctionExpression())[0]
.get("body");
amdFactory.pushContainer("directives", directives);
amdFactory.pushContainer("body", body);
},
},
},

View File

@@ -1,11 +1,14 @@
define(["exports"], function (exports) {
define(["exports"], 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

@@ -1,8 +1,10 @@
define(["exports"], function (exports) {
define(["exports"], 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

@@ -1,8 +1,10 @@
define(["exports"], function (exports) {
define(["exports"], 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

@@ -1,8 +1,10 @@
define(["exports"], function (exports) {
define(["exports"], 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

@@ -1,9 +1,10 @@
define(["exports"], function (exports) {
define(["exports"], function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = _default;
exports.default = function () {};
function _default() {}
});

View File

@@ -1,8 +1,12 @@
define(["exports"], function (exports) {
define(["exports"], 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

@@ -1,10 +1,10 @@
define(["exports"], function (exports) {
define(["exports"], function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
exports.default = foo;
_exports.default = foo;
function foo() {}
});

View File

@@ -1,11 +1,12 @@
define(["exports"], function (exports) {
define(["exports"], 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 +1,2 @@
var foo;
export { foo as default };

View File

@@ -1,8 +1,10 @@
define(["exports"], function (exports) {
define(["exports"], 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,8 +1,10 @@
define(["exports"], function (exports) {
define(["exports"], 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

@@ -1,10 +1,10 @@
define(["exports", "foo"], function (exports, _foo) {
define(["exports", "foo"], 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,16 +1,16 @@
define(["exports", "foo"], function (exports, _foo) {
define(["exports", "foo"], 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

@@ -1,10 +1,10 @@
define(["exports", "foo"], function (exports, _foo) {
define(["exports", "foo"], 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

@@ -1,10 +1,10 @@
define(["exports", "foo"], function (exports, _foo) {
define(["exports", "foo"], 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

@@ -1,16 +1,16 @@
define(["exports", "foo"], function (exports, _foo) {
define(["exports", "foo"], 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

@@ -1,12 +1,12 @@
define(["exports", "foo"], function (exports, _foo) {
define(["exports", "foo"], 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

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

View File

@@ -1,9 +1,11 @@
define(["exports"], function (exports) {
define(["exports"], 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

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

View File

@@ -1,8 +1,10 @@
define(["exports"], function (exports) {
define(["exports"], 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;
export {foo as default};

View File

@@ -1,8 +1,10 @@
define(["exports"], function (exports) {
define(["exports"], 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

@@ -1,9 +1,11 @@
define(["exports"], function (exports) {
define(["exports"], 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};

View File

@@ -1,8 +1,10 @@
define(["exports"], function (exports) {
define(["exports"], 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

@@ -1,9 +1,10 @@
define(["exports"], function (exports) {
define(["exports"], function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
var a = 1;
exports.default = a;
_exports.default = a;
});

View File

@@ -1,24 +1,33 @@
define(["exports"], function (exports) {
define(["exports"], 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

@@ -1,19 +1,21 @@
define(["exports", "./evens"], function (exports, _evens) {
define(["exports", "./evens"], 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

@@ -1,5 +1,5 @@
define(["./foo", "./bar", "./derp", "./qux"], function (_foo, _bar, _derp, _qux) {
"use strict";
var _bar2 = babelHelpers.interopRequireDefault(_bar);
_bar = babelHelpers.interopRequireDefault(_bar);
});

View File

@@ -1,8 +1,7 @@
define(["foo"], function (_foo) {
"use strict";
var _foo2 = babelHelpers.interopRequireDefault(_foo);
_foo2.default;
_foo2.default;
_foo = babelHelpers.interopRequireDefault(_foo);
_foo.default;
_foo.default;
});

View File

@@ -1,6 +1,6 @@
define(["foo"], function (_foo) {
define(["foo"], function (foo) {
"use strict";
var foo = babelHelpers.interopRequireWildcard(_foo);
foo = babelHelpers.interopRequireWildcard(foo);
foo;
});

View File

@@ -1,8 +1,7 @@
define(["foo"], function (_foo) {
"use strict";
var _foo2 = babelHelpers.interopRequireDefault(_foo);
_foo2.default;
_foo = babelHelpers.interopRequireDefault(_foo);
_foo.default;
_foo.baz;
});

View File

@@ -1,10 +1,10 @@
define(["exports", "foo"], function (exports, _foo) {
define(["exports", "foo"], 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.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

@@ -1,16 +1,19 @@
define(["exports", "foo", "foo-bar", "./directory/foo-bar"], function (exports, _foo) {
define(["exports", "foo", "foo-bar", "./directory/foo-bar"], 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;
_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.default;
foo2;
_foo.bar;
_foo.foo;
foo2.bar;
foo2.foo;
});

View File

@@ -1,12 +1,14 @@
define(["exports"], function (exports) {
define(["exports"], 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;
@@ -15,13 +17,12 @@ define(["exports"], function (exports) {
})();
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

@@ -1,9 +1,10 @@
define(["exports"], function (exports) {
define(["exports"], function (_exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports["default"] = _default;
exports["default"] = function () {};
function _default() {}
});

View File

@@ -1,8 +1,8 @@
define(["exports"], function (exports) {
define(["exports"], function (_exports) {
"use strict";
exports.__esModule = true;
exports.a = a;
_exports.__esModule = true;
_exports.a = a;
function a() {}
});