UNPKG

swagger-typed-express-docs

Version:

Simple express runtime parser and documentation swagger generator with 100% support of Typescript static types

157 lines (156 loc) 7.28 kB
"use strict"; 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 __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.convertUrlsMethodsSchemaToOpenAPI = exports.generateOpenAPIPath = exports.tSchemaToJsonSchema = void 0; var utils_1 = require("./utils"); var anyTypeOpenAPI = {}; var tSchemaToJsonSchema = function (schema, mut_definitions) { if (mut_definitions === void 0) { mut_definitions = {}; } var obj = __assign({}, (schema.required ? {} : { nullable: true })); switch (schema.type) { case 'boolean': return __assign(__assign({}, obj), { type: 'boolean' }); case 'number': return __assign(__assign({}, obj), { type: 'number' }); case 'string': return __assign(__assign({}, obj), { type: 'string' }); case 'enum': return __assign(__assign({}, obj), { type: 'string', enum: schema.options }); case 'object': var required = Object.entries(schema.properties) .filter(function (_a) { var _b = __read(_a, 2), k = _b[0], v = _b[1]; return v.required === true; }) .map(function (_a) { var _b = __read(_a, 2), k = _b[0], v = _b[1]; return k; }); return __assign(__assign(__assign({}, obj), (required.length > 0 ? { required: required } : {})), { type: 'object', properties: (0, utils_1.mapEntries)(function (_a) { var _b = __read(_a, 2), k = _b[0], v = _b[1]; return [k, (0, exports.tSchemaToJsonSchema)(v, mut_definitions)]; }, schema.properties) }); case 'hashMap': return __assign(__assign({}, obj), { type: 'object', additionalProperties: (0, exports.tSchemaToJsonSchema)(schema.property, mut_definitions) }); case 'array': return __assign(__assign({}, obj), { type: 'array', items: (0, exports.tSchemaToJsonSchema)(schema.items, mut_definitions) }); case 'oneOf': return __assign(__assign({}, obj), { oneOf: schema.options.map(function (option) { return (0, exports.tSchemaToJsonSchema)(option, mut_definitions); }) }); case 'any': return anyTypeOpenAPI; case 'transformType': return (0, exports.tSchemaToJsonSchema)(schema.encodedTSchema, mut_definitions); case 'lazy': if (!mut_definitions[schema.name]) { mut_definitions[schema.name] = 'will be filled in th future'; mut_definitions[schema.name] = (0, exports.tSchemaToJsonSchema)(schema.getSchema(), mut_definitions); } return { $ref: "#/components/schemas/".concat(schema.name) }; default: return __assign(__assign({}, obj), { type: schema.type }); } }; exports.tSchemaToJsonSchema = tSchemaToJsonSchema; var generateOpenAPIPath = function (schemas, mut_definitions) { var _a, _b, _c, _d, _e, _f; var x = __assign(__assign({ parameters: __spreadArray(__spreadArray(__spreadArray([], __read(Object.entries((_b = (_a = schemas.pathSchema) === null || _a === void 0 ? void 0 : _a.properties) !== null && _b !== void 0 ? _b : {}).map(function (_a) { var _b = __read(_a, 2), k = _b[0], v = _b[1]; return ({ in: 'path', name: k, required: v.required, schema: (0, exports.tSchemaToJsonSchema)(v, mut_definitions), }); })), false), __read(Object.entries((_d = (_c = schemas.querySchema) === null || _c === void 0 ? void 0 : _c.properties) !== null && _d !== void 0 ? _d : {}).map(function (_a) { var _b = __read(_a, 2), k = _b[0], v = _b[1]; return ({ in: 'query', name: k, required: v.required, schema: (0, exports.tSchemaToJsonSchema)(v, mut_definitions), }); })), false), __read(Object.entries((_f = (_e = schemas.headersSchema) === null || _e === void 0 ? void 0 : _e.properties) !== null && _f !== void 0 ? _f : {}).map(function (_a) { var _b = __read(_a, 2), k = _b[0], v = _b[1]; return ({ in: 'header', name: k, required: v.required, schema: (0, exports.tSchemaToJsonSchema)(v, mut_definitions), }); })), false).filter(Boolean) }, ((0, utils_1.isObject)(schemas.bodySchema) ? { requestBody: { required: true, content: { 'application/json': { schema: (0, exports.tSchemaToJsonSchema)(schemas.bodySchema, mut_definitions), }, }, }, } : {})), { responses: { 200: __assign({ description: '200 response' }, ((0, utils_1.isObject)(schemas.returnsSchema) ? { content: { 'application/json': { schema: (0, exports.tSchemaToJsonSchema)(schemas.returnsSchema, mut_definitions), }, }, } : {})), } }); return x; }; exports.generateOpenAPIPath = generateOpenAPIPath; var colonUrlVariableReplaceWithBrackets = function (url) { return url.replaceAll(/:(\w+)/g, '{$1}'); }; var convertUrlsMethodsSchemaToOpenAPI = function (obj, mutDefinitions) { return (0, utils_1.mapEntries)(function (_a) { var _b = __read(_a, 2), url = _b[0], methods = _b[1]; return [ colonUrlVariableReplaceWithBrackets(url), (0, utils_1.mapEntries)(function (_a) { var _b = __read(_a, 2), method = _b[0], schema = _b[1]; return [ method, (0, exports.generateOpenAPIPath)(schema, mutDefinitions), ]; }, methods), ]; }, obj); }; exports.convertUrlsMethodsSchemaToOpenAPI = convertUrlsMethodsSchemaToOpenAPI;