UNPKG

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
"use strict"; 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;