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