-
Notifications
You must be signed in to change notification settings - Fork 188
/
specFilter.ts
63 lines (55 loc) · 2.01 KB
/
specFilter.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
"use strict";
import { OpenAPIV3 } from "openapi-types";
import { Utils } from "./utils";
import { SpecParserError } from "./specParserError";
import { ErrorType, ParseOptions } from "./interfaces";
import { ConstantString } from "./constants";
import { ValidatorFactory } from "./validators/validatorFactory";
export class SpecFilter {
static specFilter(
filter: string[],
unResolveSpec: OpenAPIV3.Document,
resolvedSpec: OpenAPIV3.Document,
options: ParseOptions
): OpenAPIV3.Document {
try {
const newSpec = { ...unResolveSpec };
const newPaths: OpenAPIV3.PathsObject = {};
for (const filterItem of filter) {
const [method, path] = filterItem.split(" ");
const methodName = method.toLowerCase();
const pathObj = resolvedSpec.paths?.[path] as any;
if (
ConstantString.AllOperationMethods.includes(methodName) &&
pathObj &&
pathObj[methodName]
) {
const validator = ValidatorFactory.create(resolvedSpec, options);
const validateResult = validator.validateAPI(methodName, path);
if (!validateResult.isValid) {
continue;
}
if (!newPaths[path]) {
newPaths[path] = { ...unResolveSpec.paths[path] };
for (const m of ConstantString.AllOperationMethods) {
delete (newPaths[path] as any)[m];
}
}
(newPaths[path] as any)[methodName] = (unResolveSpec.paths[path] as any)[methodName];
// Add the operationId if missing
if (!(newPaths[path] as any)[methodName].operationId) {
(newPaths[path] as any)[
methodName
].operationId = `${methodName}${Utils.convertPathToCamelCase(path)}`;
}
}
}
newSpec.paths = newPaths;
return newSpec;
} catch (err) {
throw new SpecParserError((err as Error).toString(), ErrorType.FilterSpecFailed);
}
}
}