prostgles-types
Version:
Shared TypeScript object definitions for prostgles-client and prostgles-server
136 lines • 4.86 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getJSONSchemaObject = exports.DATA_TYPES = exports.PrimitiveArrayTypes = exports.PrimitiveTypes = void 0;
exports.getJSONBSchemaAsJSONSchema = getJSONBSchemaAsJSONSchema;
const util_1 = require("../util");
exports.PrimitiveTypes = [
"boolean",
"number",
"integer",
"string",
"Date",
"time",
"timestamp",
"any",
];
exports.PrimitiveArrayTypes = exports.PrimitiveTypes.map((v) => `${v}[]`);
exports.DATA_TYPES = [...exports.PrimitiveTypes, ...exports.PrimitiveArrayTypes];
const getJSONSchemaType = (rawType) => {
if (!rawType)
return;
const type = rawType.endsWith("[]") ? rawType.slice(0, -2) : rawType;
return {
type: type === "integer" ? "integer"
: type === "boolean" ? "boolean"
: type === "number" ? "number"
: type === "any" ? undefined
: type === "Lookup" ? undefined
: "string",
isArray: rawType.endsWith("[]"),
};
};
const getJSONSchemaObject = (rawType, rootInfo) => {
const { type, arrayOf, arrayOfType, description, nullable, oneOf, oneOfType, title, record, ...t } = typeof rawType === "string" ? { type: rawType } : rawType;
let result = {};
const partialProps = {
...((t.enum ||
(t.allowedValues?.length && (typeof type !== "string" || !type.endsWith("[]")))) && {
enum: t.allowedValues?.slice(0) ?? t.enum.slice(0),
}),
...(!!description && { description }),
...(!!title && { title }),
};
if (t.enum?.length) {
const firstElemType = typeof t.enum[0];
partialProps.type =
firstElemType === "number" ? "number"
: firstElemType === "boolean" ? "boolean"
: "string";
}
if (typeof type === "string" || arrayOf || arrayOfType) {
/** ARRAY */
if (type && typeof type !== "string") {
throw "Not expected";
}
if (arrayOf || arrayOfType || type?.endsWith("[]")) {
const arrayItems = arrayOf || arrayOfType ? (0, exports.getJSONSchemaObject)(arrayOf || { type: arrayOfType })
: type?.startsWith("any") ? { type: undefined }
: {
type: getJSONSchemaType(type)?.type,
...(t.allowedValues && { enum: t.allowedValues.slice(0) }),
};
result = {
type: "array",
items: arrayItems,
};
/** PRIMITIVES */
}
else {
result = {
type: getJSONSchemaType(type)?.type,
};
}
/** OBJECT */
}
else if ((0, util_1.isObject)(type)) {
result = {
type: "object",
required: (0, util_1.getKeys)(type).filter((k) => {
const t = type[k];
return typeof t === "string" || !t.optional;
}),
properties: (0, util_1.getObjectEntries)(type).reduce((a, [k, v]) => {
return {
...a,
[k]: (0, exports.getJSONSchemaObject)(v),
};
}, {}),
};
}
else if (oneOf || oneOfType) {
const _oneOf = oneOf || oneOfType.map((type) => ({ type }));
result = {
oneOf: _oneOf.map((t) => (0, exports.getJSONSchemaObject)(t)),
};
}
else if (record) {
result = {
type: "object",
...(record.values &&
!record.keysEnum && { additionalProperties: (0, exports.getJSONSchemaObject)(record.values) }),
...(record.keysEnum && {
properties: record.keysEnum.reduce((a, v) => ({
...a,
[v]: !record.values ? { type: {} } : (0, exports.getJSONSchemaObject)(record.values),
}), {}),
}),
};
}
if (nullable) {
const nullDef = { type: "null" };
if (result.oneOf) {
result.oneOf.push(nullDef);
}
else if (result.enum && !result.enum.includes(null)) {
result.enum.push(null);
}
else
result = {
oneOf: [result, nullDef],
};
}
const rootSchema = !rootInfo ? undefined : ({
$id: rootInfo?.id,
$schema: "https://json-schema.org/draft/2020-12/schema",
});
return {
...rootSchema,
...partialProps,
...result,
};
};
exports.getJSONSchemaObject = getJSONSchemaObject;
function getJSONBSchemaAsJSONSchema(tableName, colName, schema) {
return (0, exports.getJSONSchemaObject)(schema, { id: `${tableName}.${colName}` });
}
//# sourceMappingURL=JSONBSchema.js.map