swagger2
Version:
Typescript-based tools for working with Swagger v2.0 documents
148 lines (147 loc) • 8.51 kB
JavaScript
// 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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