upgrade to esprima-fb - finalise es6 module syntax - closes #14
This commit is contained in:
parent
34b4030752
commit
fc7c26e924
28
README.md
28
README.md
@ -155,6 +155,34 @@ polyfill is also required negating the [polyfill caveat](#polyfill).
|
||||
require("6to5/register");
|
||||
```
|
||||
|
||||
## Modules
|
||||
|
||||
6to5 modules compile straight to CommonJS, because of this various liberties are
|
||||
taken into account to ease their usage.
|
||||
|
||||
```javascript
|
||||
import "foo"; // var foo = require("foo");
|
||||
import "foo-bar"; // var fooBar = require("foo-bar");
|
||||
import "./directory/foo-bar"; // var fooBar = require("./directory/foo-bar");
|
||||
import foo from "foo"; // var foo = require("foo");
|
||||
import * as foo from "foo"; // var foo = require("foo");
|
||||
|
||||
import { bar } from "foo"; // var bar = require("foo").bar;
|
||||
import foo as bar from "foo"; // var bar = require("foo").foo;
|
||||
|
||||
export { test }; // exports.test = test;
|
||||
export var test = 5; // var test = 5; exports.test = test;
|
||||
|
||||
export default test; // module.exports = exports = test;
|
||||
```
|
||||
|
||||
If you'd like to disable this behaviour and use the more ES6-like
|
||||
[es6-module-transpiler](https://github.com/esnext/es6-module-transpiler) you can
|
||||
use the following:
|
||||
|
||||
$ 6to5 script.js -o script-compiled.js --blacklist modules
|
||||
$ compile-modules convert script-compiled.js -o script-compiled.js
|
||||
|
||||
## Caveats
|
||||
|
||||
### Polyfill
|
||||
|
||||
1
lib/6to5/templates/exports-default-require-key.js
Normal file
1
lib/6to5/templates/exports-default-require-key.js
Normal file
@ -0,0 +1 @@
|
||||
module.exports = exports = require(MODULE_NAME).KEY;
|
||||
1
lib/6to5/templates/exports-default-require.js
Normal file
1
lib/6to5/templates/exports-default-require.js
Normal file
@ -0,0 +1 @@
|
||||
module.exports = exports = require(MODULE_NAME);
|
||||
@ -1 +1 @@
|
||||
exports = module.exports = VALUE;
|
||||
module.exports = exports = VALUE;
|
||||
|
||||
1
lib/6to5/templates/exports-require-assign.js
Normal file
1
lib/6to5/templates/exports-require-assign.js
Normal file
@ -0,0 +1 @@
|
||||
exports.VARIABLE_NAME = require(MODULE_NAME);
|
||||
1
lib/6to5/templates/require-key.js
Normal file
1
lib/6to5/templates/require-key.js
Normal file
@ -0,0 +1 @@
|
||||
require(MODULE_NAME).KEY;
|
||||
@ -1,87 +1,119 @@
|
||||
var path = require("path");
|
||||
var util = require("../util");
|
||||
var b = require("ast-types").builders;
|
||||
var _ = require("lodash");
|
||||
|
||||
var toModuleNameIdentifier = function (node) {
|
||||
var id = node.source.value;
|
||||
id = path.basename(id, path.extname(id));
|
||||
id = util.camelCase(id);
|
||||
return b.identifier(id);
|
||||
};
|
||||
|
||||
exports.ImportDeclaration = function (node) {
|
||||
var nodes = [];
|
||||
|
||||
_.each(node.specifiers, function (specifier) {
|
||||
var variableName = specifier.name || specifier.id;
|
||||
if (node.specifiers.length) {
|
||||
_.each(node.specifiers, function (specifier) {
|
||||
var variableName = specifier.name || specifier.id;
|
||||
var key = specifier.id.name;
|
||||
|
||||
var key = specifier.id.name;
|
||||
var templateName = "require-assign";
|
||||
if (specifier.type === "ImportSpecifier") {
|
||||
if (key !== "default") templateName += "-key";
|
||||
}
|
||||
|
||||
var templateName = "require-assign";
|
||||
if (node.kind !== "default") templateName += "-key";
|
||||
|
||||
nodes.push(util.template(templateName, {
|
||||
VARIABLE_NAME: variableName.name,
|
||||
MODULE_NAME: node.source,
|
||||
KEY: key
|
||||
nodes.push(util.template(templateName, {
|
||||
VARIABLE_NAME: variableName.name,
|
||||
MODULE_NAME: node.source.raw,
|
||||
KEY: key
|
||||
}));
|
||||
});
|
||||
} else {
|
||||
nodes.push(util.template("require-assign", {
|
||||
VARIABLE_NAME: toModuleNameIdentifier(node),
|
||||
MODULE_NAME: node.source.raw
|
||||
}));
|
||||
});
|
||||
}
|
||||
|
||||
return nodes;
|
||||
};
|
||||
|
||||
exports.ModuleDeclaration = function (node) {
|
||||
return util.template("require-assign", {
|
||||
VARIABLE_NAME: node.id,
|
||||
MODULE_NAME: node.source
|
||||
});
|
||||
};
|
||||
|
||||
exports.ExportDeclaration = function (node) {
|
||||
var nodes = [];
|
||||
|
||||
var pushSpecifiers = function (node, nodes) {
|
||||
_.each(node.specifiers, function (specifier) {
|
||||
var variableName = specifier.name || specifier.id;
|
||||
|
||||
if (node.source) {
|
||||
if (specifier.type === "ExportBatchSpecifier") {
|
||||
nodes.push(util.template("exports-wildcard", {
|
||||
MODULE_NAME: node.source
|
||||
MODULE_NAME: node.source.raw
|
||||
}, true));
|
||||
} else {
|
||||
nodes.push(util.template("exports-require-assign-key", {
|
||||
var templateName;
|
||||
|
||||
if (variableName.name === "default") {
|
||||
templateName = "exports-default-require";
|
||||
} else {
|
||||
templateName = "exports-require-assign";
|
||||
}
|
||||
|
||||
if (specifier.id.name !== "default") templateName += "-key";
|
||||
|
||||
nodes.push(util.template(templateName, {
|
||||
VARIABLE_NAME: variableName.name,
|
||||
MODULE_NAME: node.source,
|
||||
MODULE_NAME: node.source.raw,
|
||||
KEY: specifier.id
|
||||
}, true));
|
||||
}
|
||||
} else {
|
||||
nodes.push(util.template("exports-assign", {
|
||||
VALUE: specifier.id,
|
||||
KEY: specifier.id
|
||||
}, true));
|
||||
}
|
||||
});
|
||||
|
||||
var declar = node.declaration;
|
||||
|
||||
if (declar) {
|
||||
if (node.default) {
|
||||
nodes.push(util.template("exports-default", {
|
||||
VALUE: declar
|
||||
}, true));
|
||||
} else {
|
||||
if (declar.type === "VariableDeclaration") {
|
||||
nodes.push(declar);
|
||||
|
||||
_.each(declar.declarations, function (declar) {
|
||||
nodes.push(util.template("exports-alias-var", {
|
||||
STRING_KEY: b.literal(declar.id.name),
|
||||
KEY: declar.id
|
||||
}, true));
|
||||
});
|
||||
} else if (declar.type === "FunctionDeclaration") {
|
||||
declar.type = "FunctionExpression";
|
||||
|
||||
if (variableName.name === "default") {
|
||||
nodes.push(util.template("exports-default", {
|
||||
VALUE: specifier.id
|
||||
}, true));
|
||||
} else {
|
||||
nodes.push(util.template("exports-assign", {
|
||||
KEY: declar.id,
|
||||
VALUE: declar
|
||||
VALUE: specifier.id,
|
||||
KEY: variableName
|
||||
}, true));
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
var pushDeclaration = function (node, nodes) {
|
||||
var declar = node.declaration;
|
||||
|
||||
if (node.default) {
|
||||
if (declar.type === "FunctionDeclaration") {
|
||||
declar.type = "FunctionExpression";
|
||||
} else if (declar.type === "ClassDeclaration") {
|
||||
declar.type = "ClassExpression";
|
||||
}
|
||||
|
||||
nodes.push(util.template("exports-default", {
|
||||
VALUE: declar
|
||||
}, true));
|
||||
} else {
|
||||
var id = declar.id;
|
||||
if (declar.type === "VariableDeclaration") {
|
||||
id = declar.declarations[0].id;
|
||||
}
|
||||
|
||||
nodes.push(declar);
|
||||
nodes.push(util.template("exports-assign", {
|
||||
VALUE: id,
|
||||
KEY: id
|
||||
}, true));
|
||||
}
|
||||
};
|
||||
|
||||
exports.ExportDeclaration = function (node) {
|
||||
var nodes = [];
|
||||
|
||||
if (node.declaration) {
|
||||
pushDeclaration(node, nodes);
|
||||
} else {
|
||||
pushSpecifiers(node, nodes);
|
||||
}
|
||||
|
||||
return nodes;
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
var estraverse = require("estraverse");
|
||||
var escodegen = require("escodegen");
|
||||
var traverse = require("./traverse");
|
||||
var esprima = require("esprima");
|
||||
var esprima = require("esprima-fb");
|
||||
var path = require("path");
|
||||
var fs = require("fs");
|
||||
var _ = require("lodash");
|
||||
@ -79,6 +79,12 @@ exports.errorWithNode = function (node, msg) {
|
||||
return err;
|
||||
};
|
||||
|
||||
exports.camelCase = function (value) {
|
||||
return value.replace(/[-_\s]+(.)?/g, function (match, c){
|
||||
return c ? c.toUpperCase() : "";
|
||||
});
|
||||
};
|
||||
|
||||
exports.canCompile = function (filename) {
|
||||
var ext = path.extname(filename);
|
||||
return ext === ".js" || ext === ".es6";
|
||||
|
||||
@ -40,7 +40,7 @@
|
||||
"ast-types": "0.5.0",
|
||||
"commander": "2.3.0",
|
||||
"escodegen": "https://github.com/Constellation/escodegen/archive/624550d0d6edf812a661902c6908dedff66005a7.tar.gz",
|
||||
"esprima": "https://github.com/esnext/esprima/archive/ebda4fb14a2aad61c54a83006c061c1649636985.tar.gz",
|
||||
"esprima-fb": "7001.1.0-dev-harmony-fb",
|
||||
"estraverse": "1.5.1",
|
||||
"fs-readdir-recursive": "0.0.2",
|
||||
"lodash": "2.4.1",
|
||||
@ -55,6 +55,7 @@
|
||||
"mocha": "1.21.4",
|
||||
"traceur": "0.0.66",
|
||||
"esnext": "0.11.1",
|
||||
"es6now": "0.8.11"
|
||||
"es6now": "0.8.11",
|
||||
"jstransform": "^6.3.2"
|
||||
}
|
||||
}
|
||||
|
||||
@ -1 +0,0 @@
|
||||
export { encrypt as enc } from "crypto";
|
||||
@ -1 +0,0 @@
|
||||
exports.enc = require("crypto").encrypt;
|
||||
@ -1,5 +0,0 @@
|
||||
export default test;
|
||||
|
||||
export default function (foo, bar) {
|
||||
|
||||
};
|
||||
@ -1,5 +0,0 @@
|
||||
exports = module.exports = test;
|
||||
|
||||
exports = module.exports = function (foo, bar) {
|
||||
|
||||
};
|
||||
@ -1 +0,0 @@
|
||||
export { foo, bar } from "crypto";
|
||||
@ -1,2 +0,0 @@
|
||||
exports.foo = require("crypto").foo;
|
||||
exports.bar = require("crypto").bar;
|
||||
@ -1,3 +0,0 @@
|
||||
export function wow(foo, bar) {
|
||||
|
||||
}
|
||||
@ -1,3 +0,0 @@
|
||||
exports.wow = function wow(foo, bar) {
|
||||
|
||||
};
|
||||
1
test/fixtures/modules/export-var/actual.js
vendored
1
test/fixtures/modules/export-var/actual.js
vendored
@ -1 +0,0 @@
|
||||
export var foo = "test";
|
||||
7
test/fixtures/modules/export-var/expected.js
vendored
7
test/fixtures/modules/export-var/expected.js
vendored
@ -1,7 +0,0 @@
|
||||
var foo = "test";
|
||||
|
||||
Object.defineProperty(exports, "foo", {
|
||||
get: function () {
|
||||
return foo;
|
||||
}
|
||||
});
|
||||
@ -1 +0,0 @@
|
||||
export * from "crypto";
|
||||
@ -1,5 +0,0 @@
|
||||
(function (obj) {
|
||||
for (var i in obj) {
|
||||
exports[i] = obj[i];
|
||||
}
|
||||
}(require("crypto")));
|
||||
1
test/fixtures/modules/export/actual.js
vendored
1
test/fixtures/modules/export/actual.js
vendored
@ -1 +0,0 @@
|
||||
export { foo, bar };
|
||||
2
test/fixtures/modules/export/expected.js
vendored
2
test/fixtures/modules/export/expected.js
vendored
@ -1,2 +0,0 @@
|
||||
exports.foo = foo;
|
||||
exports.bar = bar;
|
||||
8
test/fixtures/modules/exports-default/actual.js
vendored
Normal file
8
test/fixtures/modules/exports-default/actual.js
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
export default 42;
|
||||
export default {};
|
||||
export default [];
|
||||
export default foo;
|
||||
export default function () {}
|
||||
export default class {}
|
||||
export default function foo () {}
|
||||
export default class foo {}
|
||||
8
test/fixtures/modules/exports-default/expected.js
vendored
Normal file
8
test/fixtures/modules/exports-default/expected.js
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
module.exports = exports = 42;
|
||||
module.exports = exports = {};
|
||||
module.exports = exports = [];
|
||||
module.exports = exports = foo;
|
||||
module.exports = exports = function () {}
|
||||
module.exports = exports = class {}
|
||||
module.exports = exports = function foo () {}
|
||||
module.exports = exports = class foo {}
|
||||
8
test/fixtures/modules/exports-from/actual.js
vendored
Normal file
8
test/fixtures/modules/exports-from/actual.js
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
export * from "foo";
|
||||
export {foo} from "foo";
|
||||
export {foo, bar} from "foo";
|
||||
export {foo as bar} from "foo";
|
||||
export {foo as default} from "foo";
|
||||
export {foo as default, bar} from "foo";
|
||||
export {default} from "foo";
|
||||
export {default as foo} from "foo";
|
||||
22
test/fixtures/modules/exports-from/expected.js
vendored
Normal file
22
test/fixtures/modules/exports-from/expected.js
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
(function (obj) {
|
||||
for (var i in obj) {
|
||||
exports[i] = obj[i];
|
||||
}
|
||||
}(require("foo")));
|
||||
|
||||
exports.foo = require("foo").foo;
|
||||
|
||||
exports.foo = require("foo").foo;
|
||||
exports.bar = require("foo").bar;
|
||||
|
||||
exports.bar = require("foo").foo;
|
||||
|
||||
module.exports = exports = require("foo").foo;
|
||||
|
||||
module.exports = exports = require("foo").foo;
|
||||
exports.bar = require("foo").bar;
|
||||
|
||||
module.exports = exports = require("foo");
|
||||
|
||||
exports.foo = require("foo");
|
||||
|
||||
5
test/fixtures/modules/exports-named/actual.js
vendored
Normal file
5
test/fixtures/modules/exports-named/actual.js
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
export {foo};
|
||||
export {foo, bar};
|
||||
export {foo as bar};
|
||||
export {foo as default};
|
||||
export {foo as default, bar};
|
||||
11
test/fixtures/modules/exports-named/expected.js
vendored
Normal file
11
test/fixtures/modules/exports-named/expected.js
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
exports.foo = foo;
|
||||
|
||||
exports.foo = foo;
|
||||
exports.bar = bar;
|
||||
|
||||
exports.bar = foo;
|
||||
|
||||
module.exports = exports = foo;
|
||||
|
||||
module.exports = exports = foo;
|
||||
exports.bar = bar;
|
||||
8
test/fixtures/modules/exports-variable/actual.js
vendored
Normal file
8
test/fixtures/modules/exports-variable/actual.js
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
export var foo = 1;
|
||||
export var foo = function () {};
|
||||
export var bar;
|
||||
export let foo = 2;
|
||||
export let bar;
|
||||
export const foo = 3;
|
||||
export function foo () {}
|
||||
export class foo {}
|
||||
23
test/fixtures/modules/exports-variable/expected.js
vendored
Normal file
23
test/fixtures/modules/exports-variable/expected.js
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
var foo = 1;
|
||||
exports.foo = foo;
|
||||
|
||||
var foo = function () {};
|
||||
exports.foo = foo;
|
||||
|
||||
var bar;
|
||||
exports.bar = bar;
|
||||
|
||||
let foo = 2;
|
||||
exports.foo = foo;
|
||||
|
||||
let bar;
|
||||
exports.bar = bar;
|
||||
|
||||
const foo = 3;
|
||||
exports.foo = foo;
|
||||
|
||||
function foo () {}
|
||||
exports.foo = foo;
|
||||
|
||||
class foo {}
|
||||
exports.foo = foo;
|
||||
@ -1 +0,0 @@
|
||||
import { encrypt as enc } from "crypto";
|
||||
@ -1 +0,0 @@
|
||||
var enc = require("crypto").encrypt;
|
||||
@ -1 +0,0 @@
|
||||
import { encrypt, decrypt } from "crypto";
|
||||
@ -1,2 +0,0 @@
|
||||
var encrypt = require("crypto").encrypt;
|
||||
var decrypt = require("crypto").decrypt;
|
||||
1
test/fixtures/modules/import-from/actual.js
vendored
1
test/fixtures/modules/import-from/actual.js
vendored
@ -1 +0,0 @@
|
||||
import $ from "jquery";
|
||||
@ -1 +0,0 @@
|
||||
var $ = require("jquery");
|
||||
2
test/fixtures/modules/imports-default/actual.js
vendored
Normal file
2
test/fixtures/modules/imports-default/actual.js
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
import foo from "foo";
|
||||
import {default as foo} from "foo";
|
||||
2
test/fixtures/modules/imports-default/expected.js
vendored
Normal file
2
test/fixtures/modules/imports-default/expected.js
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
var foo = require("foo");
|
||||
var foo = require("foo");
|
||||
1
test/fixtures/modules/imports-glob/actual.js
vendored
Normal file
1
test/fixtures/modules/imports-glob/actual.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
import * as foo from "foo";
|
||||
1
test/fixtures/modules/imports-glob/expected.js
vendored
Normal file
1
test/fixtures/modules/imports-glob/expected.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
var foo = require("foo");
|
||||
2
test/fixtures/modules/imports-mixing/actual.js
vendored
Normal file
2
test/fixtures/modules/imports-mixing/actual.js
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
import foo, {baz as xyz} from "foo";
|
||||
import foo, * as bar from "foo";
|
||||
5
test/fixtures/modules/imports-mixing/expected.js
vendored
Normal file
5
test/fixtures/modules/imports-mixing/expected.js
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
var foo = require("foo");
|
||||
var xyz = require("foo").baz;
|
||||
|
||||
var foo = require("foo");
|
||||
var bar = require("foo");
|
||||
4
test/fixtures/modules/imports-named/actual.js
vendored
Normal file
4
test/fixtures/modules/imports-named/actual.js
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
import {bar} from "foo";
|
||||
import {bar, baz} from "foo";
|
||||
import {bar as baz} from "foo";
|
||||
import {bar as baz, xyz} from "foo";
|
||||
9
test/fixtures/modules/imports-named/expected.js
vendored
Normal file
9
test/fixtures/modules/imports-named/expected.js
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
var bar = require("foo").bar;
|
||||
|
||||
var bar = require("foo").bar;
|
||||
var baz = require("foo").baz;
|
||||
|
||||
var baz = require("foo").bar;
|
||||
|
||||
var baz = require("foo").bar;
|
||||
var xyz = require("foo").xyz;
|
||||
3
test/fixtures/modules/imports/actual.js
vendored
Normal file
3
test/fixtures/modules/imports/actual.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
import "foo";
|
||||
import "foo-bar";
|
||||
import "./directory/foo-bar";
|
||||
3
test/fixtures/modules/imports/expected.js
vendored
Normal file
3
test/fixtures/modules/imports/expected.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
var foo = require("foo");
|
||||
var fooBar = require("foo-bar");
|
||||
var fooBar = require("./directory/foo-bar");
|
||||
1
test/fixtures/modules/module-from/actual.js
vendored
1
test/fixtures/modules/module-from/actual.js
vendored
@ -1 +0,0 @@
|
||||
module crypto from "crypto";
|
||||
@ -1 +0,0 @@
|
||||
var crypto = require("crypto");
|
||||
Loading…
x
Reference in New Issue
Block a user