UNPKG

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