UNPKG

swagger-typed-express-docs

Version:

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

149 lines (148 loc) 6.66 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 = void 0; var utils_1 = require("./utils"); var anyTypeOpenAPI = {}; var toOpenAPISchema = function (schema, mutDefinitions) { var obj = __assign({}, (schema.required ? {} : { nullable: true })); switch (schema.type) { 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, toOpenAPISchema(v, mutDefinitions)]; }, schema.properties) }); case 'hashMap': return __assign(__assign({}, obj), { type: 'object', additionalProperties: toOpenAPISchema(schema.property, mutDefinitions) }); case 'array': return __assign(__assign({}, obj), { type: 'array', items: toOpenAPISchema(schema.items, mutDefinitions) }); case 'oneOf': return __assign(__assign({}, obj), { oneOf: schema.options.map(function (option) { return toOpenAPISchema(option, mutDefinitions); }) }); case 'any': return anyTypeOpenAPI; case 'transformType': return toOpenAPISchema(schema.encodedTSchema, mutDefinitions); case 'lazy': if (!mutDefinitions[schema.name]) { mutDefinitions[schema.name] = 'will be filled in th future'; mutDefinitions[schema.name] = toOpenAPISchema(schema.getSchema(), mutDefinitions); } return { $ref: "#/components/schemas/".concat(schema.name) }; default: return __assign(__assign({}, obj), { type: schema.type }); } }; var generateOpenAPIPath = function (schemas, mutDefinitions) { 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: toOpenAPISchema(v, mutDefinitions), }); })), 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: toOpenAPISchema(v, mutDefinitions), }); })), 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: toOpenAPISchema(v, mutDefinitions), }); })), false).filter(Boolean) }, ((0, utils_1.isObject)(schemas.bodySchema) ? { requestBody: { required: true, content: { 'application/json': { schema: toOpenAPISchema(schemas.bodySchema, mutDefinitions), }, }, }, } : {})), { responses: { 200: __assign({ description: '200 response' }, ((0, utils_1.isObject)(schemas.returnsSchema) ? { content: { 'application/json': { schema: toOpenAPISchema(schemas.returnsSchema, mutDefinitions), }, }, } : {})), } }); 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;