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.
97 lines (96 loc) • 3.18 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 extractProperties_1 = __importDefault(require("../extractProperties"));
var parseGenerics = function (_a) {
var node = _a.node, ids = _a.ids, imports = _a.imports, props = _a.props, paths = _a.paths, resolveCustomGenerics = _a.resolveCustomGenerics, extension = _a.extension;
var name = "";
node.forEachChild(function (n) {
if ((0, typescript_1.isIdentifier)(n))
name = n.escapedText.toString();
});
if (name === "")
return __assign({}, props);
var typeArgs = node.typeArguments;
if (!typeArgs || !resolveCustomGenerics)
return __assign({}, props);
var resolvingFunc = resolveCustomGenerics[name];
var argProps = {};
var propsPerArg = [];
for (var _i = 0, typeArgs_1 = typeArgs; _i < typeArgs_1.length; _i++) {
var arg = typeArgs_1[_i];
argProps = (0, extractProperties_1.default)({
node: arg,
imports: imports,
ids: ids,
resolveCustomGenerics: resolveCustomGenerics,
paths: paths,
props: argProps,
extension: extension
});
}
var newProps = resolvingFunc({
propertiesPerArg: propsPerArg,
combinedProperties: argProps,
});
return newProps;
};
exports.default = parseGenerics;
// let genericNode:
// | ts.TypeAliasDeclaration
// | ts.InterfaceDeclaration
// | undefined;
// const newNode = ids[name]?.parent;
// if (
// name in ids &&
// (isTypeAliasDeclaration(newNode) || isInterfaceDeclaration(newNode))
// )
// genericNode = newNode;
// else if (name in imports)
// genericNode = searchForExport({ imports, paths, name });
// else return { ...props };
// if (!genericNode) return { ...props };
// const typeParams = genericNode.typeParameters
/*
// const extracted = extractProperties({
// imports,
// ids,
// node: arg,
// paths,
// props,
// resolveCustomGenerics,
// });
// propsPerArg.push(extracted);
// if (isInterfaceDeclaration(arg))
// argProps = mergeProps({
// node: arg,
// imports,
// ids,
// paths,
// props: argProps,
// resolveCustomGenerics,
// });
// else
// argProps = mergeObj({
// node: arg,
// imports,
// ids,
// paths,
// props: argProps,
// resolveCustomGenerics,
// });
*/