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.
140 lines (139 loc) • 5.31 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 ts_morph_1 = require("ts-morph");
var typescript_1 = require("typescript");
var mergeProps_1 = __importDefault(require("./mergeFuncs/mergeProps"));
var parseProperties_1 = __importDefault(require("./parseStatements/parseProperties"));
var mergeObj_1 = __importDefault(require("./mergeFuncs/mergeObj"));
var parsePropValues_1 = __importDefault(require("./parseStatements/parsePropValues"));
var parseGenerics_1 = __importDefault(require("./parseStatements/parseGenerics"));
var parseTypeRefs_1 = __importDefault(require("./parseStatements/parseTypeRefs"));
function extractProperties(_a) {
var imports = _a.imports, ids = _a.ids, node = _a.node, paths = _a.paths, props = _a.props, resolveCustomGenerics = _a.resolveCustomGenerics, extension = _a.extension;
switch (ts_morph_1.ts.SyntaxKind[node.kind]) {
case "IntersectionType":
props = (0, mergeObj_1.default)({
node: node,
imports: imports,
ids: ids,
paths: paths,
props: props,
resolveCustomGenerics: resolveCustomGenerics,
extension: extension
});
break;
case "TypeLiteral":
props = (0, mergeProps_1.default)({
node: node,
imports: imports,
ids: ids,
paths: paths,
props: props,
resolveCustomGenerics: resolveCustomGenerics,
extension: extension
});
break;
case "InterfaceDeclaration":
props = (0, mergeProps_1.default)({
node: node,
imports: imports,
ids: ids,
paths: paths,
props: props,
resolveCustomGenerics: resolveCustomGenerics,
extension: extension
});
break;
case "TypeAliasDeclaration":
props = (0, mergeObj_1.default)({
node: node,
imports: imports,
ids: ids,
paths: paths,
props: props,
resolveCustomGenerics: resolveCustomGenerics,
extension: extension
});
break;
case "UnionType":
props = {
anyOf: [],
};
node.forEachChild(function (n) {
props.anyOf.push(__assign({}, extractProperties({
imports: imports,
ids: ids,
node: n,
paths: paths,
props: {},
resolveCustomGenerics: resolveCustomGenerics,
extension: extension
})));
});
break;
case "PropertySignature":
props = (0, parseProperties_1.default)({
imports: imports,
ids: ids,
node: node,
paths: paths,
props: props,
resolveCustomGenerics: resolveCustomGenerics,
extension: extension
});
break;
case "TypeReference":
//parse generics
if ((0, typescript_1.isTypeReferenceNode)(node) && node.typeArguments) {
props = (0, parseGenerics_1.default)({
node: node,
props: props,
ids: ids,
imports: imports,
paths: paths,
resolveCustomGenerics: resolveCustomGenerics,
extension: extension
});
}
else
props = (0, parseTypeRefs_1.default)({
node: node,
props: props,
ids: ids,
imports: imports,
paths: paths,
resolveCustomGenerics: resolveCustomGenerics,
extension: extension
});
break;
default:
var newProps = (0, parsePropValues_1.default)({
node: node,
ids: ids,
imports: imports,
paths: paths,
props: props,
resolveCustomGenerics: resolveCustomGenerics,
extension: extension
});
if (newProps && typeof newProps !== "string")
props = newProps;
break;
}
return props;
}
exports.default = extractProperties;