maketypes
Version:
Make TypeScript types and proxy objects from example JSON objects. Can use proxy objects to dynamically type check JSON at runtime.
700 lines • 50 kB
JavaScript
"use strict";
var emit_1 = require("./emit");
function pascalCase(n) {
return n.split("_").map(function (s) { return (s[0] ? s[0].toUpperCase() : "") + s.slice(1); }).join("");
}
function getReferencedRecordShapes(e, s, sh) {
switch (sh.type) {
case 2 /* RECORD */:
if (!s.has(sh)) {
s.add(sh);
sh.getReferencedRecordShapes(e, s);
}
break;
case 6 /* COLLECTION */:
getReferencedRecordShapes(e, s, sh.baseShape);
break;
case 7 /* ANY */:
sh.getDistilledShapes(e).forEach(function (sh) { return getReferencedRecordShapes(e, s, sh); });
break;
}
}
exports.getReferencedRecordShapes = getReferencedRecordShapes;
var FieldContext = (function () {
function FieldContext(parent, field) {
this.parent = parent;
this.field = field;
}
Object.defineProperty(FieldContext.prototype, "type", {
get: function () {
return 1 /* FIELD */;
},
enumerable: true,
configurable: true
});
FieldContext.prototype.getName = function (e) {
var name = pascalCase(this.field);
return name;
};
return FieldContext;
}());
exports.FieldContext = FieldContext;
var EntityContext = (function () {
function EntityContext(parent) {
this.parent = parent;
}
Object.defineProperty(EntityContext.prototype, "type", {
get: function () {
return 0 /* ENTITY */;
},
enumerable: true,
configurable: true
});
EntityContext.prototype.getName = function (e) {
return this.parent.getName(e) + "Entity";
};
return EntityContext;
}());
exports.EntityContext = EntityContext;
var CBottomShape = (function () {
function CBottomShape() {
}
Object.defineProperty(CBottomShape.prototype, "type", {
get: function () {
return 0 /* BOTTOM */;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CBottomShape.prototype, "nullable", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
CBottomShape.prototype.makeNullable = function () {
throw new TypeError("Doesn't make sense.");
};
CBottomShape.prototype.makeNonNullable = function () {
return this;
};
CBottomShape.prototype.emitType = function (e) {
throw new Error("Doesn't make sense.");
};
CBottomShape.prototype.getProxyType = function (e) {
throw new Error("Doesn't make sense.");
};
CBottomShape.prototype.equal = function (t) {
return this === t;
};
return CBottomShape;
}());
exports.CBottomShape = CBottomShape;
exports.BottomShape = new CBottomShape();
var CNullShape = (function () {
function CNullShape() {
}
Object.defineProperty(CNullShape.prototype, "nullable", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CNullShape.prototype, "type", {
get: function () {
return 1 /* NULL */;
},
enumerable: true,
configurable: true
});
CNullShape.prototype.makeNullable = function () {
return this;
};
CNullShape.prototype.makeNonNullable = function () {
return this;
};
CNullShape.prototype.emitType = function (e) {
e.interfaces.write("null");
};
CNullShape.prototype.getProxyType = function (e) {
return "null";
};
CNullShape.prototype.equal = function (t) {
return this === t;
};
return CNullShape;
}());
exports.CNullShape = CNullShape;
exports.NullShape = new CNullShape();
var CNumberShape = (function () {
function CNumberShape() {
}
Object.defineProperty(CNumberShape.prototype, "nullable", {
get: function () {
return this === exports.NullableNumberShape;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CNumberShape.prototype, "type", {
get: function () {
return 5 /* NUMBER */;
},
enumerable: true,
configurable: true
});
CNumberShape.prototype.makeNullable = function () {
return exports.NullableNumberShape;
};
CNumberShape.prototype.makeNonNullable = function () {
return exports.NumberShape;
};
CNumberShape.prototype.emitType = function (e) {
e.interfaces.write(this.getProxyType(e));
};
CNumberShape.prototype.getProxyType = function (e) {
var rv = "number";
if (this.nullable) {
rv += " | null";
}
return rv;
};
CNumberShape.prototype.equal = function (t) {
return this === t;
};
return CNumberShape;
}());
exports.CNumberShape = CNumberShape;
exports.NumberShape = new CNumberShape();
exports.NullableNumberShape = new CNumberShape();
var CStringShape = (function () {
function CStringShape() {
}
Object.defineProperty(CStringShape.prototype, "type", {
get: function () {
return 3 /* STRING */;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CStringShape.prototype, "nullable", {
get: function () {
return this === exports.NullableStringShape;
},
enumerable: true,
configurable: true
});
CStringShape.prototype.makeNullable = function () {
return exports.NullableStringShape;
};
CStringShape.prototype.makeNonNullable = function () {
return exports.StringShape;
};
CStringShape.prototype.emitType = function (e) {
e.interfaces.write(this.getProxyType(e));
};
CStringShape.prototype.getProxyType = function (e) {
var rv = "string";
if (this.nullable) {
rv += " | null";
}
return rv;
};
CStringShape.prototype.equal = function (t) {
return this === t;
};
return CStringShape;
}());
exports.CStringShape = CStringShape;
exports.StringShape = new CStringShape();
exports.NullableStringShape = new CStringShape();
var CBooleanShape = (function () {
function CBooleanShape() {
}
Object.defineProperty(CBooleanShape.prototype, "type", {
get: function () {
return 4 /* BOOLEAN */;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CBooleanShape.prototype, "nullable", {
get: function () {
return this === exports.NullableBooleanShape;
},
enumerable: true,
configurable: true
});
CBooleanShape.prototype.makeNullable = function () {
return exports.NullableBooleanShape;
};
CBooleanShape.prototype.makeNonNullable = function () {
return exports.BooleanShape;
};
CBooleanShape.prototype.emitType = function (e) {
e.interfaces.write(this.getProxyType(e));
};
CBooleanShape.prototype.getProxyType = function (e) {
var rv = "boolean";
if (this.nullable) {
rv += " | null";
}
return rv;
};
CBooleanShape.prototype.equal = function (t) {
return this === t;
};
return CBooleanShape;
}());
exports.CBooleanShape = CBooleanShape;
exports.BooleanShape = new CBooleanShape();
exports.NullableBooleanShape = new CBooleanShape();
var CAnyShape = (function () {
function CAnyShape(shapes, nullable) {
this._nullable = false;
this._hasDistilledShapes = false;
this._distilledShapes = [];
this._shapes = shapes;
this._nullable = nullable;
}
Object.defineProperty(CAnyShape.prototype, "type", {
get: function () {
return 7 /* ANY */;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CAnyShape.prototype, "nullable", {
get: function () {
return this._nullable === true;
},
enumerable: true,
configurable: true
});
CAnyShape.prototype.makeNullable = function () {
if (this._nullable) {
return this;
}
else {
return new CAnyShape(this._shapes, true);
}
};
CAnyShape.prototype.makeNonNullable = function () {
if (this._nullable) {
return new CAnyShape(this._shapes, false);
}
else {
return this;
}
};
CAnyShape.prototype._ensureDistilled = function (e) {
var _this = this;
if (!this._hasDistilledShapes) {
var shapes = new Map();
for (var i = 0; i < this._shapes.length; i++) {
var s = this._shapes[i];
if (!shapes.has(s.type)) {
shapes.set(s.type, []);
}
shapes.get(s.type).push(s);
}
shapes.forEach(function (shapes, key) {
var shape = exports.BottomShape;
for (var i = 0; i < shapes.length; i++) {
shape = csh(e, shape, shapes[i]);
}
_this._distilledShapes.push(shape);
});
this._hasDistilledShapes = true;
}
};
CAnyShape.prototype.getDistilledShapes = function (e) {
this._ensureDistilled(e);
return this._distilledShapes;
};
CAnyShape.prototype.addToShapes = function (shape) {
var shapeClone = this._shapes.slice(0);
shapeClone.push(shape);
return new CAnyShape(shapeClone, this._nullable);
};
CAnyShape.prototype.emitType = function (e) {
var _this = this;
this._ensureDistilled(e);
this._distilledShapes.forEach(function (s, i) {
s.emitType(e);
if (i < _this._distilledShapes.length - 1) {
e.interfaces.write(" | ");
}
});
};
CAnyShape.prototype.getProxyType = function (e) {
this._ensureDistilled(e);
return this._distilledShapes.map(function (s) { return s.getProxyType(e); }).join(" | ");
};
CAnyShape.prototype.equal = function (t) {
return this === t;
};
return CAnyShape;
}());
exports.CAnyShape = CAnyShape;
var CRecordShape = (function () {
function CRecordShape(fields, nullable, contexts) {
var _this = this;
this._name = null;
// Assign a context to all fields.
var fieldsWithContext = new Map();
fields.forEach(function (val, index) {
if (val.type === 2 /* RECORD */ || val.type === 6 /* COLLECTION */) {
fieldsWithContext.set(index, val.addContext(new FieldContext(_this, index)));
}
else {
fieldsWithContext.set(index, val);
}
});
this._fields = fieldsWithContext;
this._nullable = nullable;
this.contexts = contexts;
}
Object.defineProperty(CRecordShape.prototype, "type", {
get: function () {
return 2 /* RECORD */;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CRecordShape.prototype, "nullable", {
get: function () {
return this._nullable;
},
enumerable: true,
configurable: true
});
/**
* Construct a new record shape. Returns an existing, equivalent record shape
* if applicable.
*/
CRecordShape.Create = function (e, fields, nullable, contexts) {
if (contexts === void 0) { contexts = []; }
var record = new CRecordShape(fields, nullable, contexts);
return e.registerRecordShape(record);
};
CRecordShape.prototype.makeNullable = function () {
if (this._nullable) {
return this;
}
else {
return new CRecordShape(this._fields, true, this.contexts);
}
};
CRecordShape.prototype.addContext = function (ctx) {
this.contexts.push(ctx);
return this;
};
CRecordShape.prototype.makeNonNullable = function () {
if (this._nullable) {
return new CRecordShape(this._fields, false, this.contexts);
}
else {
return this;
}
};
CRecordShape.prototype.forEachField = function (cb) {
this._fields.forEach(cb);
};
CRecordShape.prototype.getField = function (name) {
var t = this._fields.get(name);
if (!t) {
return exports.NullShape;
}
else {
return t;
}
};
CRecordShape.prototype.equal = function (t) {
if (t.type === 2 /* RECORD */ && this._nullable === t._nullable && this._fields.size === t._fields.size) {
var rv_1 = true;
var tFields_1 = t._fields;
// Check all fields.
// NOTE: Since size is equal, no need to iterate over t. Either they have the same fields
// or t is missing fields from this one.
this.forEachField(function (t, name) {
if (rv_1) {
var field = tFields_1.get(name);
if (field) {
rv_1 = field.equal(t);
}
else {
rv_1 = false;
}
}
});
return rv_1;
}
return false;
};
CRecordShape.prototype.emitType = function (e) {
e.interfaces.write(this.getName(e));
if (this.nullable) {
e.interfaces.write(" | null");
}
};
CRecordShape.prototype.getProxyClass = function (e) {
return this.getName(e) + "Proxy";
};
CRecordShape.prototype.getProxyType = function (e) {
var rv = this.getName(e) + "Proxy";
if (this.nullable) {
rv += " | null";
}
return rv;
};
CRecordShape.prototype.emitInterfaceDefinition = function (e) {
var w = e.interfaces;
w.write("export interface " + this.getName(e) + " {").endl();
this.forEachField(function (t, name) {
w.tab(1).write(name);
if (t.nullable) {
w.write("?");
}
w.write(": ");
t.emitType(e);
w.write(";").endl();
});
w.write("}");
};
CRecordShape.prototype.emitProxyClass = function (e) {
var w = e.proxies;
w.writeln("export class " + this.getProxyClass(e) + " {");
this.forEachField(function (t, name) {
w.tab(1).writeln("public readonly " + name + ": " + t.getProxyType(e) + ";");
});
w.tab(1).writeln("public static Parse(d: string): " + this.getProxyType(e) + " {");
w.tab(2).writeln("return " + this.getProxyClass(e) + ".Create(JSON.parse(d));");
w.tab(1).writeln("}");
w.tab(1).writeln("public static Create(d: any, field: string = 'root'): " + this.getProxyType(e) + " {");
w.tab(2).writeln("if (!field) {");
w.tab(3).writeln("obj = d;");
w.tab(3).writeln("field = \"root\";");
w.tab(2).writeln("}");
w.tab(2).writeln("if (d === null || d === undefined) {");
w.tab(3);
if (this.nullable) {
w.writeln("return null;");
}
else {
e.markHelperAsUsed('throwNull2NonNull');
w.writeln("throwNull2NonNull(field, d);");
}
w.tab(2).writeln("} else if (typeof(d) !== 'object') {");
e.markHelperAsUsed('throwNotObject');
w.tab(3).writeln("throwNotObject(field, d, " + this.nullable + ");");
w.tab(2).writeln("} else if (Array.isArray(d)) {");
e.markHelperAsUsed('throwIsArray');
w.tab(3).writeln("throwIsArray(field, d, " + this.nullable + ");");
w.tab(2).writeln("}");
// At this point, we know we have a non-null object.
// Check all fields.
this.forEachField(function (t, name) {
emit_1.emitProxyTypeCheck(e, w, t, 2, "d." + name, "field + \"." + name + "\"");
});
w.tab(2).writeln("return new " + this.getProxyClass(e) + "(d);");
w.tab(1).writeln("}");
w.tab(1).writeln("private constructor(d: any) {");
// Emit an assignment for each field.
this.forEachField(function (t, name) {
w.tab(2).writeln("this." + name + " = d." + name + ";");
});
w.tab(1).writeln("}");
w.writeln('}');
};
CRecordShape.prototype.getReferencedRecordShapes = function (e, rv) {
this.forEachField(function (t, name) {
getReferencedRecordShapes(e, rv, t);
});
};
CRecordShape.prototype.markAsRoot = function (name) {
this._name = name;
};
CRecordShape.prototype.getName = function (e) {
if (typeof (this._name) === 'string') {
return this._name;
}
// Calculate unique name.
var nameSet = new Set();
var name = this.contexts
.map(function (c) { return c.getName(e); })
.filter(function (n) {
if (!nameSet.has(n)) {
nameSet.add(n);
return true;
}
return false;
})
.join("Or");
this._name = e.registerName(name);
return this._name;
};
return CRecordShape;
}());
exports.CRecordShape = CRecordShape;
var CCollectionShape = (function () {
function CCollectionShape(baseShape, contexts) {
if (contexts === void 0) { contexts = []; }
this._name = null;
// Add context if a record/collection.
this.baseShape = (baseShape.type === 2 /* RECORD */ || baseShape.type === 6 /* COLLECTION */) ? baseShape.addContext(new EntityContext(this)) : baseShape;
this.contexts = contexts;
}
Object.defineProperty(CCollectionShape.prototype, "type", {
get: function () {
return 6 /* COLLECTION */;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CCollectionShape.prototype, "nullable", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
CCollectionShape.prototype.makeNullable = function () {
return this;
};
CCollectionShape.prototype.makeNonNullable = function () {
return this;
};
CCollectionShape.prototype.addContext = function (ctx) {
this.contexts.push(ctx);
return this;
};
CCollectionShape.prototype.emitType = function (e) {
e.interfaces.write("(");
this.baseShape.emitType(e);
e.interfaces.write(")[] | null");
};
CCollectionShape.prototype.getProxyType = function (e) {
var base = this.baseShape.getProxyType(e);
if (base.indexOf("|") !== -1) {
return "(" + base + ")[] | null";
}
else {
return base + "[] | null";
}
};
CCollectionShape.prototype.equal = function (t) {
return t.type === 6 /* COLLECTION */ && this.baseShape.equal(t.baseShape);
};
CCollectionShape.prototype.getName = function (e) {
if (typeof (this._name) === 'string') {
return this._name;
}
var nameSet = new Set();
// No need to make collection names unique.
this._name = this.contexts
.map(function (c) { return c.getName(e); })
.filter(function (name) {
if (!nameSet.has(name)) {
nameSet.add(name);
return true;
}
return false;
})
.join("Or");
return this._name;
};
return CCollectionShape;
}());
exports.CCollectionShape = CCollectionShape;
function csh(e, s1, s2) {
// csh(σ, σ) = σ
if (s1 === s2) {
return s1;
}
if (s1.type === 6 /* COLLECTION */ && s2.type === 6 /* COLLECTION */) {
// csh([σ1], [σ2]) = [csh(σ1, σ2)]
return new CCollectionShape(csh(e, s1.baseShape, s2.baseShape));
}
// csh(⊥, σ) = csh(σ, ⊥) = σ
if (s1.type === 0 /* BOTTOM */) {
return s2;
}
if (s2.type === 0 /* BOTTOM */) {
return s1;
}
// csh(null, σ) = csh(σ, null) = nullable<σ>
if (s1.type === 1 /* NULL */) {
return s2.makeNullable();
}
if (s2.type === 1 /* NULL */) {
return s1.makeNullable();
}
// csh(any, σ) = csh(σ, any) = any
if (s1.type === 7 /* ANY */) {
return s1.addToShapes(s2);
}
if (s2.type === 7 /* ANY */) {
return s2.addToShapes(s1);
}
// csh(σ2, nullable<σˆ1> ) = csh(nullable<σˆ1> , σ2) = nullable<csh(σˆ1, σ2)>
if (s1.nullable && s1.type !== 6 /* COLLECTION */) {
return csh(e, s1.makeNonNullable(), s2).makeNullable();
}
if (s2.nullable && s2.type !== 6 /* COLLECTION */) {
return csh(e, s2.makeNonNullable(), s1).makeNullable();
}
// (recd) rule
if (s1.type === 2 /* RECORD */ && s2.type === 2 /* RECORD */) {
// Get all fields.
var fields_1 = new Map();
s1.forEachField(function (t, name) {
fields_1.set(name, csh(e, t, s2.getField(name)));
});
s2.forEachField(function (t, name) {
if (!fields_1.has(name)) {
fields_1.set(name, csh(e, t, s1.getField(name)));
}
});
return CRecordShape.Create(e, fields_1, false);
}
// (any) rule
return new CAnyShape([s1, s2], s1.nullable || s2.nullable);
}
exports.csh = csh;
function d2s(e, d) {
if (d === undefined || d === null) {
return exports.NullShape;
}
switch (typeof (d)) {
case 'number':
return exports.NumberShape;
case 'string':
return exports.StringShape;
case 'boolean':
return exports.BooleanShape;
}
// Must be an object or array.
if (Array.isArray(d)) {
// Empty array: Not enough information to figure out a precise type.
if (d.length === 0) {
return new CCollectionShape(exports.NullShape);
}
var t = exports.BottomShape;
for (var i = 0; i < d.length; i++) {
t = csh(e, t, d2s(e, d[i]));
}
return new CCollectionShape(t);
}
var keys = Object.keys(d);
var fields = new Map();
for (var i = 0; i < keys.length; i++) {
var name = keys[i];
fields.set(name, d2s(e, d[name]));
}
return CRecordShape.Create(e, fields, false);
}
exports.d2s = d2s;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0JBQThEO0FBb0I5RCxvQkFBb0IsQ0FBUztJQUMzQixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBN0MsQ0FBNkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBRUQsbUNBQTBDLENBQVUsRUFBRSxDQUFvQixFQUFFLEVBQVM7SUFDbkYsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDaEIsS0FBSyxjQUFnQjtZQUNuQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNmLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ1YsRUFBRSxDQUFDLHlCQUF5QixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNyQyxDQUFDO1lBQ0QsS0FBSyxDQUFDO1FBQ1IsS0FBSyxrQkFBb0I7WUFDdkIseUJBQXlCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDOUMsS0FBSyxDQUFDO1FBQ1IsS0FBSyxXQUFhO1lBQ2hCLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQyxFQUFFLElBQUssT0FBQSx5QkFBeUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FB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