add support for an optional runtime - closes #129

This commit is contained in:
Sebastian McKenzie
2014-11-09 12:02:06 +11:00
parent 8ef5148870
commit ab9cd4e630
8 changed files with 175 additions and 25 deletions

View File

@@ -5,7 +5,6 @@ var SHEBANG_REGEX = /^\#\!.*/;
var transform = require("./transformation/transform");
var generate = require("./generation/generator");
var Scope = require("./traverse/scope");
var acorn = require("acorn-6to5");
var util = require("./util");
var t = require("./types");
var _ = require("lodash");
@@ -19,6 +18,8 @@ function File(opts) {
this.ast = {};
}
File.declarations = ["extends", "class-props", "slice"];
File.normaliseOptions = function (opts) {
opts = opts || {};
@@ -28,7 +29,8 @@ File.normaliseOptions = function (opts) {
whitelist: [],
sourceMap: false,
filename: "unknown",
modules: "common"
modules: "common",
runtime: false
});
_.defaults(opts, {
@@ -36,6 +38,10 @@ File.normaliseOptions = function (opts) {
sourceMapName: opts.filename
});
if (opts.runtime === true) {
opts.runtime = "to5Runtime";
}
transform._ensureTransformerNames("blacklist", opts.blacklist);
transform._ensureTransformerNames("whitelist", opts.whitelist);
@@ -43,18 +49,18 @@ File.normaliseOptions = function (opts) {
};
File.prototype.getModuleFormatter = function (type) {
var ModuleLoader = transform.moduleFormatters[type];
var ModuleFormatter = transform.moduleFormatters[type];
if (!ModuleLoader) {
if (!ModuleFormatter) {
var loc = util.resolve(type);
if (loc) ModuleLoader = require(loc);
if (loc) ModuleFormatter = require(loc);
}
if (!ModuleLoader) {
if (!ModuleFormatter) {
throw new ReferenceError("unknown module formatter type " + type);
}
return new ModuleLoader(this);
return new ModuleFormatter(this);
};
File.prototype.parseShebang = function (code) {
@@ -70,13 +76,26 @@ File.prototype.parseShebang = function (code) {
};
File.prototype.addDeclaration = function (name) {
if (!_.contains(File.declarations, name)) {
throw new ReferenceError("unknown declaration " + name);
}
var declar = this.declarations[name];
if (declar) return declar.uid;
var ref;
var runtimeNamespace = this.opts.runtime;
if (runtimeNamespace) {
name = t.identifier(t.toIdentifier(name));
return t.memberExpression(t.identifier(runtimeNamespace), name);
} else {
ref = util.template(name);
}
var uid = t.identifier(this.generateUid(name));
this.declarations[name] = {
uid: uid,
node: util.template(name)
node: ref
};
return uid;
};
@@ -118,7 +137,7 @@ File.prototype.generate = function () {
var opts = this.opts;
var ast = this.ast;
var result = generate(this.code, ast, opts);
var result = generate(ast, opts, this.code);
if (this.shebang) {
// add back shebang
@@ -133,7 +152,10 @@ File.prototype.generate = function () {
};
File.prototype.generateUid = function (name, scope) {
name = t.toIdentifier(name);
scope = scope || this.scope;
var uid;
do {
uid = this._generateUid(name);
@@ -142,17 +164,6 @@ File.prototype.generateUid = function (name, scope) {
};
File.prototype._generateUid = function (name) {
// replace all non-valid identifiers with dashes
name = name.replace(/[^a-zA-Z0-9]/g, "-");
// remove all dashes and numbers from start of name
name = name.replace(/^[-0-9]+/, "");
// camel case
name = name.replace(/[-_\s]+(.)?/g, function (match, c) {
return c ? c.toUpperCase() : "";
});
var uids = this.uids;
var i = uids[name] || 1;

View File

@@ -2,6 +2,8 @@ var transform = require("./transformation/transform");
var fs = require("fs");
var _ = require("lodash");
exports.runtime = require("./runtime");
exports.register = function (opts) {
var register = require("./register");
if (opts != null) register(opts);

44
lib/6to5/runtime.js Normal file
View File

@@ -0,0 +1,44 @@
var generator = require("./generation/generator");
var util = require("./util");
var File = require("./file");
var t = require("./types");
var _ = require("lodash");
module.exports = function (namespace) {
var body = [];
var container = t.functionExpression(null, [], t.blockStatement(body));
var tree = {
type: "Program",
body: [t.expressionStatement(t.callExpression(container, []))]
};
body.push(t.variableDeclaration("var", [
t.variableDeclarator(t.identifier("self"), t.conditionalExpression(
t.binaryExpression("===",
t.unaryExpression("typeof", t.identifier("global"), true),
t.literal("undefined")
),
t.identifier("window"),
t.identifier("global"))
)
]));
var namespace = t.identifier(namespace || "to5Runtime");
body.push(t.variableDeclaration("var", [
t.variableDeclarator(
namespace,
t.assignmentExpression("=", t.memberExpression(t.identifier("self"), namespace), t.objectExpression([]))
)
]));
_.each(File.declarations, function (name) {
var key = t.identifier(t.toIdentifier(name));
body.push(t.expressionStatement(
t.assignmentExpression("=", t.memberExpression(namespace, key), util.template(name))
));
});
return generator(tree).code;
};