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.
77 lines (76 loc) • 2.81 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 extractProperties_1 = __importDefault(require("../extractProperties"));
function convertValue(_a) {
var node = _a.node, ids = _a.ids, imports = _a.imports, props = _a.props, paths = _a.paths, resolveCustomGenerics = _a.resolveCustomGenerics, extension = _a.extension;
if ((0, typescript_1.isIdentifier)(node)) {
var name_1 = node.escapedText.toString();
if (name_1 === "Date")
return { bsonType: "date" };
return name_1;
}
if ((0, typescript_1.isLiteralTypeNode)(node))
return convertValue({
node: node.literal,
ids: ids,
imports: imports,
props: props,
paths: paths,
resolveCustomGenerics: resolveCustomGenerics,
extension: extension
});
if ((0, typescript_1.isArrayTypeNode)(node))
return {
bsonType: "array",
items: __assign({}, (0, extractProperties_1.default)({
node: node.elementType,
ids: ids,
imports: imports,
props: props,
paths: paths,
resolveCustomGenerics: resolveCustomGenerics,
extension: extension
})),
};
if ((0, typescript_1.isStringLiteral)(node))
return {
bsonType: "string",
enum: [node.text],
};
if ((0, typescript_1.isNumericLiteral)(node))
return {
bsonType: "double",
enum: [node.text],
};
switch (ts_morph_1.ts.SyntaxKind[node.kind]) {
case "StringKeyword":
return { bsonType: "string" };
case "BooleanKeyword":
return { bsonType: "bool" };
case "NumberKeyword":
return { bsonType: "double" };
case "TrueKeyword":
return { bsonType: "bool", enum: [true] };
case "FalseKeyword":
return { bsonType: "bool", enum: [false] };
default:
return undefined;
}
}
exports.default = convertValue;