UNPKG

swagger2

Version:

Typescript-based tools for working with Swagger v2.0 documents

148 lines (147 loc) 8.51 kB
// src/compiler.ts import jsonValidator from "is-my-json-valid"; import deref from "json-schema-deref-sync"; function stringValidator(schema) { const validator = jsonValidator(schema); return (inputValue) => { if (inputValue === void 0) { return !schema["required"]; } let value = inputValue; switch (schema["type"]) { case "number": case "integer": { if (!Number.isNaN(value)) { value = Number(value); } break; } case "boolean": { if (value === "true") { value = true; } else if (value === "false") { value = false; } break; } case "array": { if (!Array.isArray(value)) { const format = schema["collectionFormat"] ?? "csv"; switch (format) { case "csv": { value = String(value).split(","); break; } case "ssv": { value = String(value).split(" "); break; } case "tsv": { value = String(value).split(" "); break; } case "pipes": { value = String(value).split("|"); break; } case "multi": default: { value = [value]; break; } } } switch (schema["items"].type) { case "number": case "integer": { value = value.map((number_) => { if (!Number.isNaN(number_)) { return Number(number_); } return number_; }); break; } case "boolean": { value = value.map((bool) => { if (bool === "true") { return true; } else if (bool === "false") { return false; } return bool; }); break; } default: } break; } default: } return validator(value); }; } function compile(document) { const swagger = deref(document); for (const pathName of Object.keys(swagger.paths)) { const path = swagger.paths[pathName]; for (const operationName of Object.keys(path).filter( (name) => name !== "parameters" )) { const operation = path[operationName]; const parameters = {}; const resolveParameter = (parameter) => { parameters[`${parameter.name}:${parameter.location}`] = parameter; }; (path["parameters"] ?? []).forEach(resolveParameter); (operation?.parameters ?? []).forEach(resolveParameter); operation.resolvedParameters = Object.keys(parameters).map( (key) => parameters[key] ); operation.resolvedParameters.forEach((parameter) => { const schema = parameter.schema ?? parameter; if (parameter.in === "query" || parameter.in === "header" || parameter.in === "path") { parameter.validator = stringValidator(schema); } else { parameter.validator = jsonValidator(schema); } }); for (const statusCode of Object.keys(operation.responses)) { const response = operation.responses[statusCode]; if (response.schema) { response.validator = jsonValidator(response.schema); } else { response.validator = (body) => body === void 0 || body === null || body === ""; } } } } const basePath = swagger.basePath ?? ""; const matcher = Object.keys(swagger.paths).map((name) => ({ name, // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style path: swagger.paths[name], // eslint-disable-next-line require-unicode-regexp regex: new RegExp( // eslint-disable-next-line require-unicode-regexp,sonarjs/slow-regex,unicorn/prefer-string-replace-all `^${basePath.replace(/\/*$/, "")}${name.replace(/{[^}]*}/g, "[^/]+")}/?$` ), // eslint-disable-next-line require-unicode-regexp,id-length expected: (name.match(/[^/]+/g) ?? []).map((s) => s.toString()) })); return (path) => { const matches = matcher.filter((match) => Boolean(match.regex.test(path))); if (matches.length === 0) { return; } return { requestPath: path.slice(basePath.length), ...matches[0] }; }; } export { compile }; //# sourceMappingURL=data:application/json;base64,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