ts-to-mongo-schema
Version:
Using the Typescript Compiler API, this program parses through Typescript, to generate a JSON Schema that conforms to MongoDB's bson format. Useful when generating large schemas, and being unable to use a javascript or typescript library like Moongoose.
90 lines (89 loc) • 4.12 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var typescript_1 = require("typescript");
var generateNewFilePath_1 = __importDefault(require("../utilityFuncs/generateNewFilePath"));
var findParentTypeNode_1 = __importDefault(require("../searchNodeFunc/findParentTypeNode"));
var mergeObj_1 = __importDefault(require("../mergeFuncs/mergeObj"));
var mergeProps_1 = __importDefault(require("../mergeFuncs/mergeProps"));
var generateSchema_1 = require("../generateSchema");
var parseTypeRef = function (_a) {
var node = _a.node, props = _a.props, ids = _a.ids, imports = _a.imports, paths = _a.paths, resolveCustomGenerics = _a.resolveCustomGenerics, extension = _a.extension;
var newProps = __assign({}, props);
node.forEachChild(function (n) {
if ((0, typescript_1.isIdentifier)(n)) {
var nodeName = n.escapedText.toString();
switch (true) {
//built in types
case nodeName === "Date":
newProps = { bsonType: "date" };
break;
case nodeName === "ObjectId":
newProps = { bsonType: "objectId" };
break;
//lookup node in ids, and recurse back to find props
case nodeName in ids:
var idParent = (0, findParentTypeNode_1.default)(ids[nodeName].parent);
if (!idParent)
return newProps;
else if ((0, typescript_1.isInterfaceDeclaration)(idParent))
newProps = (0, mergeProps_1.default)({
node: idParent,
imports: imports,
ids: ids,
paths: paths,
props: newProps,
resolveCustomGenerics: resolveCustomGenerics,
extension: extension,
});
else
newProps = (0, mergeObj_1.default)({
node: idParent,
imports: imports,
ids: ids,
paths: paths,
props: newProps,
resolveCustomGenerics: resolveCustomGenerics,
extension: extension,
});
break;
case nodeName in imports:
/*
1. lookup node in imports, and find file.
2. Then find id, and recurse back to find props
*/
var newFilePath = (0, generateNewFilePath_1.default)({
imports: imports,
paths: paths,
name: nodeName,
extension: extension,
});
newProps = __assign(__assign({}, props), (0, generateSchema_1.generateSchema)({
configPath: paths.configPath,
filePath: newFilePath,
identifier: nodeName,
resolveCustomGenerics: resolveCustomGenerics,
extension: extension,
}));
break;
default:
break;
}
}
});
return newProps;
};
exports.default = parseTypeRef;