clean up classes output

This commit is contained in:
Sebastian McKenzie
2015-03-06 02:25:24 +11:00
parent 65998c3437
commit 7a6e568940
46 changed files with 263 additions and 367 deletions

View File

@@ -48,7 +48,7 @@ export default class File {
static helpers = [
"inherits",
"defaults",
"prototype-properties",
"create-class",
"apply-constructor",
"tagged-template-literal",
"tagged-template-literal-loose",

View File

@@ -1,6 +1,5 @@
import cloneDeep from "lodash/lang/cloneDeep";
import traverse from "../../traversal";
import clone from "lodash/lang/clone";
import each from "lodash/collection/each";
import has from "lodash/object/has";
import t from "../../types";
@@ -14,7 +13,7 @@ export function push(mutatorMap, key, kind, computed, value) {
} else if (t.isLiteral(key)) {
alias = String(key.value);
} else {
alias = JSON.stringify(traverse.removeProperties(cloneDeep(key)));
alias = JSON.stringify(traverse.removeProperties(t.cloneDeep(key)));
}
var map;
@@ -33,7 +32,7 @@ export function push(mutatorMap, key, kind, computed, value) {
map[kind] = value;
}
export function build(mutatorMap) {
export function toClassObject(mutatorMap) {
var objExpr = t.objectExpression([]);
each(mutatorMap, function (map) {
@@ -41,22 +40,43 @@ export function build(mutatorMap) {
var propNode = t.property("init", map._key, mapNode, map._computed);
if (!map.get && !map.set) {
map.writable = t.literal(true);
}
if (map.enumerable === false) {
delete map.enumerable;
} else {
map.enumerable = t.literal(true);
}
map.configurable = t.literal(true);
each(map, function (node, key) {
if (key[0] === "_") return;
node = clone(node);
var inheritNode = node;
if (t.isMethodDefinition(node)) node = node.value;
var prop = t.property("init", t.identifier(key), node);
t.inheritsComments(prop, inheritNode);
t.removeComments(inheritNode);
mapNode.properties.push(prop);
});
objExpr.properties.push(propNode);
});
return objExpr;
}
export function toDefineObject(mutatorMap) {
var objExpr = t.objectExpression([]);
each(mutatorMap, function (map) {
var mapNode = t.objectExpression([]);
var propNode = t.property("init", map._key, mapNode, map._computed);
if (map.value) {
map.writable = t.literal(true);
}
map.configurable = t.literal(true);
map.enumerable = t.literal(true);
each(map, function (node, key) {
if (key[0] === "_") return;
node = t.clone(node);
var inheritNode = node;
if (t.isMethodDefinition(node)) node = node.value;

View File

@@ -0,0 +1,16 @@
(function() {
function defineProperties(target, props) {
for (var key in props) {
var prop = props[key];
prop.configurable = true;
if (prop.value) prop.writable = true;
}
Object.defineProperties(target, props);
}
return function (Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);
if (staticProps) defineProperties(Constructor, staticProps);
return Constructor;
};
})()

View File

@@ -1,4 +0,0 @@
(function (child, staticProps, instanceProps) {
if (staticProps) Object.defineProperties(child, staticProps);
if (instanceProps) Object.defineProperties(child.prototype, instanceProps);
})

View File

@@ -23,6 +23,6 @@ export function ObjectExpression(node) {
return t.callExpression(
t.memberExpression(t.identifier("Object"), t.identifier("defineProperties")),
[node, defineMap.build(mutatorMap)]
[node, defineMap.toDefineObject(mutatorMap)]
);
}

View File

@@ -195,21 +195,21 @@ class ClassTransformer {
var staticProps;
if (this.hasInstanceMutators) {
instanceProps = defineMap.build(this.instanceMutatorMap);
instanceProps = defineMap.toClassObject(this.instanceMutatorMap);
}
if (this.hasStaticMutators) {
staticProps = defineMap.build(this.staticMutatorMap);
staticProps = defineMap.toClassObject(this.staticMutatorMap);
}
if (instanceProps || staticProps) {
staticProps ||= t.literal(null);
instanceProps ||= t.literal(null);
var args = [className, staticProps];
if (instanceProps) args.push(instanceProps);
var args = [className, instanceProps];
if (staticProps) args.push(staticProps);
body.push(t.expressionStatement(
t.callExpression(this.file.addHelper("prototype-properties"), args)
t.callExpression(this.file.addHelper("create-class"), args)
));
}
}
@@ -253,7 +253,6 @@ class ClassTransformer {
}
defineMap.push(mutatorMap, methodName, kind, node.computed, node);
defineMap.push(mutatorMap, methodName, "enumerable", node.computed, false);
}
/**