UNPKG

maketypes

Version:

Make TypeScript types and proxy objects from example JSON objects. Can use proxy objects to dynamically type check JSON at runtime.

242 lines 25.4 kB
"use strict"; var types_1 = require("./types"); function emitProxyTypeCheck(e, w, t, tabLevel, dataVar, fieldName) { switch (t.type) { case 7 /* ANY */: // TODO: This is terrible. var distilledShapes_1 = t.getDistilledShapes(e); w.tab(tabLevel).writeln("// This will be refactored in the next release."); distilledShapes_1.forEach(function (s, i) { w.tab(tabLevel + i).writeln("try {"); emitProxyTypeCheck(e, w, s, tabLevel + i + 1, dataVar, fieldName); w.tab(tabLevel + i).writeln("} catch (e) {"); if (i === distilledShapes_1.length - 1) { w.tab(tabLevel + i + 1).writeln("throw e;"); } }); for (var i = 0; i < distilledShapes_1.length; i++) { w.tab(tabLevel + (distilledShapes_1.length - i - 1)).writeln("}"); } break; case 4 /* BOOLEAN */: e.markHelperAsUsed('checkBoolean'); w.tab(tabLevel).writeln("checkBoolean(" + dataVar + ", " + t.nullable + ", " + fieldName + ");"); break; case 0 /* BOTTOM */: throw new TypeError('Impossible: Bottom should never appear in a type.'); case 6 /* COLLECTION */: e.markHelperAsUsed('checkArray'); w.tab(tabLevel).writeln("checkArray(" + dataVar + ", " + fieldName + ");"); w.tab(tabLevel).writeln("if (" + dataVar + ") {"); // Now, we check each element. w.tab(tabLevel + 1).writeln("for (let i = 0; i < " + dataVar + ".length; i++) {"); emitProxyTypeCheck(e, w, t.baseShape, tabLevel + 2, dataVar + "[i]", fieldName + " + \"[\" + i + \"]\""); w.tab(tabLevel + 1).writeln("}"); w.tab(tabLevel).writeln("}"); break; case 1 /* NULL */: e.markHelperAsUsed('checkNull'); w.tab(tabLevel).writeln("checkNull(" + dataVar + ", " + fieldName + ");"); break; case 5 /* NUMBER */: e.markHelperAsUsed('checkNumber'); w.tab(tabLevel).writeln("checkNumber(" + dataVar + ", " + t.nullable + ", " + fieldName + ");"); break; case 2 /* RECORD */: // Convert into a proxy. w.tab(tabLevel).writeln(dataVar + " = " + t.getProxyClass(e) + ".Create(" + dataVar + ", " + fieldName + ");"); break; case 3 /* STRING */: e.markHelperAsUsed('checkString'); w.tab(tabLevel).writeln("checkString(" + dataVar + ", " + t.nullable + ", " + fieldName + ");"); break; } // Standardize undefined into null. if (t.nullable) { w.tab(tabLevel).writeln("if (" + dataVar + " === undefined) {"); w.tab(tabLevel + 1).writeln(dataVar + " = null;"); w.tab(tabLevel).writeln("}"); } } exports.emitProxyTypeCheck = emitProxyTypeCheck; var Emitter = (function () { function Emitter(interfaces, proxies) { this._records = []; this._claimedNames = new Set(); this._helpersToEmit = new Set(); this.interfaces = interfaces; this.proxies = proxies; } Emitter.prototype.markHelperAsUsed = function (n) { this._helpersToEmit.add(n); }; Emitter.prototype.emit = function (root, rootName) { var rootShape = types_1.d2s(this, root); if (rootShape.type === 6 /* COLLECTION */) { rootShape = rootShape.baseShape; } this.proxies.writeln("// Stores the currently-being-typechecked object for error messages."); this.proxies.writeln("let obj: any = null;"); if (rootShape.type !== 2 /* RECORD */) { this._claimedNames.add(rootName); var roots = new Set(); types_1.getReferencedRecordShapes(this, roots, rootShape); var rootArray_1 = new Array(); roots.forEach(function (root) { return rootArray_1.push(root); }); if (rootArray_1.length === 1) { this._emitRootRecordShape(rootName + "Entity", rootArray_1[0]); } else { for (var i = 0; i < rootArray_1.length; i++) { this._emitRootRecordShape(rootName + "Entity" + i, rootArray_1[i]); } } this.interfaces.write("export type " + rootName + " = "); rootShape.emitType(this); this.interfaces.writeln(";").endl(); this.proxies.writeln("export class " + rootName + "Proxy {"); this.proxies.tab(1).writeln("public static Parse(s: string): " + rootShape.getProxyType(this) + " {"); this.proxies.tab(2).writeln("return " + rootName + "Proxy.Create(JSON.parse(s));"); this.proxies.tab(1).writeln("}"); this.proxies.tab(1).writeln("public static Create(s: any, fieldName?: string): " + rootShape.getProxyType(this) + " {"); this.proxies.tab(2).writeln("if (!fieldName) {"); this.proxies.tab(3).writeln("obj = s;"); this.proxies.tab(3).writeln("fieldName = \"root\";"); this.proxies.tab(2).writeln("}"); emitProxyTypeCheck(this, this.proxies, rootShape, 2, 's', "fieldName"); this.proxies.tab(2).writeln("return s;"); this.proxies.tab(1).writeln("}"); this.proxies.writeln("}").endl(); } else { this._emitRootRecordShape(rootName, rootShape); } this._emitProxyHelpers(); }; Emitter.prototype._emitRootRecordShape = function (name, rootShape) { var _this = this; this._claimedNames.add(name); rootShape.markAsRoot(name); rootShape.emitInterfaceDefinition(this); rootShape.emitProxyClass(this); this.interfaces.endl(); this.proxies.endl(); var set = new Set(); rootShape.getReferencedRecordShapes(this, set); set.forEach(function (shape) { shape.emitInterfaceDefinition(_this); shape.emitProxyClass(_this); _this.interfaces.endl(); _this.proxies.endl(); }); }; Emitter.prototype._emitProxyHelpers = function () { var w = this.proxies; var s = this._helpersToEmit; if (s.has('throwNull2NonNull')) { this.markHelperAsUsed("errorHelper"); w.writeln("function throwNull2NonNull(field: string, d: any): never {"); w.tab(1).writeln("return errorHelper(field, d, \"non-nullable object\", false);"); w.writeln("}"); } if (s.has('throwNotObject')) { this.markHelperAsUsed("errorHelper"); w.writeln("function throwNotObject(field: string, d: any, nullable: boolean): never {"); w.tab(1).writeln("return errorHelper(field, d, \"object\", nullable);"); w.writeln("}"); } if (s.has('throwIsArray')) { this.markHelperAsUsed("errorHelper"); w.writeln("function throwIsArray(field: string, d: any, nullable: boolean): never {"); w.tab(1).writeln("return errorHelper(field, d, \"object\", nullable);"); w.writeln("}"); } if (s.has('checkArray')) { this.markHelperAsUsed("errorHelper"); w.writeln("function checkArray(d: any, field: string): void {"); w.tab(1).writeln("if (!Array.isArray(d) && d !== null && d !== undefined) {"); w.tab(2).writeln("errorHelper(field, d, \"array\", true);"); w.tab(1).writeln("}"); w.writeln("}"); } if (s.has('checkNumber')) { this.markHelperAsUsed("errorHelper"); w.writeln("function checkNumber(d: any, nullable: boolean, field: string): void {"); w.tab(1).writeln("if (typeof(d) !== 'number' && (!nullable || (nullable && d !== null && d !== undefined))) {"); w.tab(2).writeln("errorHelper(field, d, \"number\", nullable);"); w.tab(1).writeln("}"); w.writeln("}"); } if (s.has('checkBoolean')) { this.markHelperAsUsed("errorHelper"); w.writeln("function checkBoolean(d: any, nullable: boolean, field: string): void {"); w.tab(1).writeln("if (typeof(d) !== 'boolean' && (!nullable || (nullable && d !== null && d !== undefined))) {"); w.tab(2).writeln("errorHelper(field, d, \"boolean\", nullable);"); w.tab(1).writeln("}"); w.writeln("}"); } if (s.has('checkString')) { this.markHelperAsUsed("errorHelper"); w.writeln("function checkString(d: any, nullable: boolean, field: string): void {"); w.tab(1).writeln("if (typeof(d) !== 'string' && (!nullable || (nullable && d !== null && d !== undefined))) {"); w.tab(2).writeln("errorHelper(field, d, \"string\", nullable);"); w.tab(1).writeln("}"); w.writeln("}"); } if (s.has('checkNull')) { this.markHelperAsUsed("errorHelper"); w.writeln("function checkNull(d: any, field: string): void {"); w.tab(1).writeln("if (d !== null && d !== undefined) {"); w.tab(2).writeln("errorHelper(field, d, \"null or undefined\", false);"); w.tab(1).writeln("}"); w.writeln("}"); } if (s.has('errorHelper')) { w.writeln("function errorHelper(field: string, d: any, type: string, nullable: boolean): never {"); w.tab(1).writeln("if (nullable) {"); w.tab(2).writeln("type += \", null, or undefined\";"); w.tab(1).writeln("}"); w.tab(1).writeln("throw new TypeError('Expected ' + type + \" at \" + field + \" but found:\\n\" + JSON.stringify(d) + \"\\n\\nFull object:\\n\" + JSON.stringify(obj));"); w.writeln("}"); } }; /** * Registers the provided shape with the emitter. If an equivalent shape * already exists, then the emitter returns the equivalent shape. */ Emitter.prototype.registerRecordShape = function (s) { var rv = this._records.filter(function (r) { return r.equal(s); }); if (rv.length === 0) { this._records.push(s); return s; } else { return rv[0]; } }; /** * Registers the provided shape name with the emitter. If another * shape has already claimed this name, it returns a similar unique * name that should be used instead. */ Emitter.prototype.registerName = function (name) { if (!this._claimedNames.has(name)) { this._claimedNames.add(name); return name; } else { var baseName = name; var i = 1; do { name = "" + baseName + i; i++; } while (this._claimedNames.has(name)); this._claimedNames.add(name); return name; } }; return Emitter; }()); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Emitter; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImVtaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLGlDQUF1RjtBQUV2Riw0QkFBbUMsQ0FBVSxFQUFFLENBQVMsRUFBRSxDQUFRLEVBQUUsUUFBZ0IsRUFBRSxPQUFlLEVBQUUsU0FBaUI7SUFDdEgsTUFBTSxDQUFBLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDaEIsS0FBSyxXQUFhO1lBQ2hCLDBCQUEwQjtZQUMxQixJQUFNLGlCQUFlLEdBQUcsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7WUFDM0UsaUJBQWUsQ0FBQyxPQUFPLENBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQztnQkFDM0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNyQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ2xFLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDN0MsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLGlCQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3JDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzlDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILEdBQUcsQ0FBQyxDQUFDLElB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