upgrade to esprima-fb - finalise es6 module syntax - closes #14

This commit is contained in:
Sebastian McKenzie 2014-10-09 13:30:22 +11:00
parent 34b4030752
commit fc7c26e924
49 changed files with 253 additions and 104 deletions

View File

@ -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

View File

@ -0,0 +1 @@
module.exports = exports = require(MODULE_NAME).KEY;

View File

@ -0,0 +1 @@
module.exports = exports = require(MODULE_NAME);

View File

@ -1 +1 @@
exports = module.exports = VALUE;
module.exports = exports = VALUE;

View File

@ -0,0 +1 @@
exports.VARIABLE_NAME = require(MODULE_NAME);

View File

@ -0,0 +1 @@
require(MODULE_NAME).KEY;

View File

@ -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;

View File

@ -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";

View File

@ -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"
}
}

View File

@ -1 +0,0 @@
export { encrypt as enc } from "crypto";

View File

@ -1 +0,0 @@
exports.enc = require("crypto").encrypt;

View File

@ -1,5 +0,0 @@
export default test;
export default function (foo, bar) {
};

View File

@ -1,5 +0,0 @@
exports = module.exports = test;
exports = module.exports = function (foo, bar) {
};

View File

@ -1 +0,0 @@
export { foo, bar } from "crypto";

View File

@ -1,2 +0,0 @@
exports.foo = require("crypto").foo;
exports.bar = require("crypto").bar;

View File

@ -1,3 +0,0 @@
export function wow(foo, bar) {
}

View File

@ -1,3 +0,0 @@
exports.wow = function wow(foo, bar) {
};

View File

@ -1 +0,0 @@
export var foo = "test";

View File

@ -1,7 +0,0 @@
var foo = "test";
Object.defineProperty(exports, "foo", {
get: function () {
return foo;
}
});

View File

@ -1 +0,0 @@
export * from "crypto";

View File

@ -1,5 +0,0 @@
(function (obj) {
for (var i in obj) {
exports[i] = obj[i];
}
}(require("crypto")));

View File

@ -1 +0,0 @@
export { foo, bar };

View File

@ -1,2 +0,0 @@
exports.foo = foo;
exports.bar = bar;

View 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 {}

View 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 {}

View 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";

View 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");

View File

@ -0,0 +1,5 @@
export {foo};
export {foo, bar};
export {foo as bar};
export {foo as default};
export {foo as default, bar};

View 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;

View 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 {}

View 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;

View File

@ -1 +0,0 @@
import { encrypt as enc } from "crypto";

View File

@ -1 +0,0 @@
var enc = require("crypto").encrypt;

View File

@ -1 +0,0 @@
import { encrypt, decrypt } from "crypto";

View File

@ -1,2 +0,0 @@
var encrypt = require("crypto").encrypt;
var decrypt = require("crypto").decrypt;

View File

@ -1 +0,0 @@
import $ from "jquery";

View File

@ -1 +0,0 @@
var $ = require("jquery");

View File

@ -0,0 +1,2 @@
import foo from "foo";
import {default as foo} from "foo";

View File

@ -0,0 +1,2 @@
var foo = require("foo");
var foo = require("foo");

View File

@ -0,0 +1 @@
import * as foo from "foo";

View File

@ -0,0 +1 @@
var foo = require("foo");

View File

@ -0,0 +1,2 @@
import foo, {baz as xyz} from "foo";
import foo, * as bar from "foo";

View File

@ -0,0 +1,5 @@
var foo = require("foo");
var xyz = require("foo").baz;
var foo = require("foo");
var bar = require("foo");

View 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";

View 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;

View File

@ -0,0 +1,3 @@
import "foo";
import "foo-bar";
import "./directory/foo-bar";

View File

@ -0,0 +1,3 @@
var foo = require("foo");
var fooBar = require("foo-bar");
var fooBar = require("./directory/foo-bar");

View File

@ -1 +0,0 @@
module crypto from "crypto";

View File

@ -1 +0,0 @@
var crypto = require("crypto");