nestjs-typebox
Version:
This library provides helper utilities for writing and validating NestJS APIs using [TypeBox](https://github.com/sinclairzx81/typebox) as an alternative to class-validator/class-transformer. Can be configured to patch @nestjs/swagger allowing OpenAPI gene
73 lines • 2.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.analyzeSchema = void 0;
const typebox_1 = require("@sinclair/typebox");
function FromArray(schema, analysis) {
Visit(schema.items, analysis);
}
function FromIntersect(schema, analysis) {
analysis.hasTransform = analysis.hasTransform || typebox_1.TypeGuard.IsTransform(schema.unevaluatedProperties);
schema.allOf.forEach(schema => Visit(schema, analysis));
}
function FromObject(schema, analysis) {
Object.values(schema.properties).forEach(schema => Visit(schema, analysis));
if (typebox_1.TypeGuard.IsSchema(schema.additionalProperties)) {
Visit(schema.additionalProperties, analysis);
}
}
function FromRecord(schema, analysis) {
if (!analysis.hasTransform && typebox_1.TypeGuard.IsSchema(schema.additionalProperties)) {
analysis.hasTransform = typebox_1.TypeGuard.IsTransform(schema.additionalProperties);
}
const pattern = Object.getOwnPropertyNames(schema.patternProperties)[0];
const property = schema.patternProperties[pattern ?? ''];
if (typebox_1.TypeGuard.IsSchema(property)) {
Visit(property, analysis);
}
}
function FromRef(schema, analysis) {
const target = analysis.references.get(schema.$ref);
if (target) {
Visit(target, analysis);
}
}
function FromTuple(schema, analysis) {
if (schema.items) {
schema.items.forEach(schema => Visit(schema, analysis));
}
}
function FromUnion(schema, analysis) {
schema.anyOf.forEach(schema => Visit(schema, analysis));
}
function Visit(schema, analysis) {
analysis.hasTransform = analysis.hasTransform || typebox_1.TypeGuard.IsTransform(schema);
analysis.hasDefault = analysis.hasDefault || 'default' in schema;
if (schema.$id) {
if (analysis.references.has(schema.$id))
return;
analysis.references.set(schema.$id, schema);
}
switch (schema[typebox_1.Kind]) {
case 'Array':
return FromArray(schema, analysis);
case 'Intersect':
return FromIntersect(schema, analysis);
case 'Object':
return FromObject(schema, analysis);
case 'Record':
return FromRecord(schema, analysis);
case 'Ref':
return FromRef(schema, analysis);
case 'Tuple':
return FromTuple(schema, analysis);
case 'Union':
return FromUnion(schema, analysis);
}
}
const analyzeSchema = (schema) => {
const analysis = { hasTransform: false, hasDefault: false, references: new Map() };
Visit(schema, analysis);
return analysis;
};
exports.analyzeSchema = analyzeSchema;
//# sourceMappingURL=analyze-schema.js.map