Skip to content

Commit d44e1f2

Browse files
committed
replace traverser
1 parent 66529a2 commit d44e1f2

6 files changed

Lines changed: 358 additions & 197 deletions

File tree

tools/proto-convert/src/Sanitizer.ts

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import _ from "lodash";
22
import type {OpenAPIV3} from "openapi-types";
3-
import {traverse} from "./utils/OpenApiTraverser";
3+
import { SpecificationVisitor, SpecificationContext, traverseSpec, MaybeRef, is_ref } from "./utils/SpecificationVisitor";
44
/**
55
* Sanitizer class:
66
* Provides a static method to sanitize a spec by updating $ref strings
@@ -69,22 +69,25 @@ export class Sanitizer {
6969
delete OpenApiSpec.components.schemas[schemaName]
7070
}
7171
}
72-
traverse(OpenApiSpec, {
73-
// Run sanitize_schema on all top-level component schemas
74-
onSchema: (schema, _schemaName) => {
75-
if (!('$ref' in schema)) {
76-
this.sanitize_schema(schema);
72+
73+
const sanitizer = this;
74+
class SanitizerVisitor extends SpecificationVisitor {
75+
visit_schema(ctx: SpecificationContext, schema: MaybeRef<OpenAPIV3.SchemaObject>): void {
76+
super.visit_schema(ctx, schema);
77+
if (!is_ref(schema)) {
78+
sanitizer.sanitize_schema(schema);
7779
}
78-
},
79-
onRequestSchema: (schema) => this.sanitize_schema(schema),
80-
onResponseSchema: (schema) => this.sanitize_schema(schema),
81-
onParameter: (param, _paramName) => {
82-
if (!('$ref' in param) && param.name && param.name.startsWith('_')) {
80+
}
81+
82+
visit_parameter(ctx: SpecificationContext, param: MaybeRef<OpenAPIV3.ParameterObject>): void {
83+
super.visit_parameter(ctx, param);
84+
if (!is_ref(param) && param.name && param.name.startsWith('_')) {
8385
param.name = Sanitizer.META_PREFIX + param.name;
8486
}
8587
}
86-
});
87-
}
88+
}
89+
traverseSpec(OpenApiSpec, new SanitizerVisitor());
90+
}
8891

8992
public sanitize_schema(schema: OpenAPIV3.SchemaObject): void {
9093
if (!schema) return;

tools/proto-convert/src/SchemaModifier.ts

Lines changed: 36 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type {OpenAPIV3} from "openapi-types";
2-
import {traverse} from './utils/OpenApiTraverser';
2+
import { SpecificationVisitor, SpecificationContext, traverseSpec, MaybeRef, is_ref } from './utils/SpecificationVisitor';
33
import isEqual from 'lodash.isequal';
44
import {compressMultipleUnderscores, isPrimitiveType, resolveObj, isReferenceObject, isEmptyObjectSchema, is_simple_ref} from './utils/helper';
55
import logger from "./utils/logger";
@@ -14,44 +14,42 @@ export class SchemaModifier {
1414
this.root = root;
1515
}
1616
public modify(): OpenAPIV3.Document {
17-
traverse(this.root, {
18-
onSchemaProperty: (schema) => {
19-
this.deduplicateEnumValue(schema)
20-
this.handleAdditionalPropertiesUndefined(schema)
21-
this.convertNullTypeToNullValue(schema)
22-
this.deduplicateOneOfWithArrayType(schema)
23-
this.collapseSingleItemComposite(schema);
24-
this.removeArrayOfMapWrapper(schema)
25-
},
26-
onSchema: (schema, schemaName) => {
27-
if (!schema || isReferenceObject(schema)) return;
28-
this.deduplicateEnumValue(schema)
29-
this.convertAdditionalPropertiesToProperty(schema)
30-
this.handleAdditionalPropertiesUndefined(schema)
31-
this.convertNullTypeToNullValue(schema)
32-
this.handleOneOfConst(schema, schemaName)
33-
this.deduplicateOneOfWithArrayType(schema)
34-
this.collapseSingleItemComposite(schema);
35-
this.collapseOneOfObjectPropContainsTitleSchema(schema)
36-
this.removeArrayOfMapWrapper(schema)
37-
this.convertOneOfToMinMaxProperties(schema)
38-
},
39-
});
40-
const visit = new Set();
41-
traverse(this.root, {
42-
onSchemaProperty: (schema) => {
43-
this.simplifySingleMapSchema(schema, visit);
44-
this.handleAdditionalPropertiesUndefined(schema)
17+
const modifier = this;
18+
19+
class FirstPassVisitor extends SpecificationVisitor {
20+
visit_schema(ctx: SpecificationContext, schema: MaybeRef<OpenAPIV3.SchemaObject>): void {
21+
super.visit_schema(ctx, schema);
22+
if (is_ref(schema)) return;
23+
24+
const schemaName = ctx.key;
25+
modifier.deduplicateEnumValue(schema);
26+
modifier.convertAdditionalPropertiesToProperty(schema);
27+
modifier.handleAdditionalPropertiesUndefined(schema);
28+
modifier.convertNullTypeToNullValue(schema);
29+
modifier.handleOneOfConst(schema, schemaName);
30+
modifier.deduplicateOneOfWithArrayType(schema);
31+
modifier.collapseSingleItemComposite(schema);
32+
modifier.collapseOneOfObjectPropContainsTitleSchema(schema);
33+
modifier.removeArrayOfMapWrapper(schema);
34+
modifier.convertOneOfToMinMaxProperties(schema);
35+
}
36+
}
37+
traverseSpec(this.root, new FirstPassVisitor());
4538

46-
},
47-
onSchema: (schema) => {
48-
if (!schema || isReferenceObject(schema)) return;
49-
this.simplifySingleMapSchema(schema, visit)
50-
this.handleAdditionalPropertiesUndefined(schema)
51-
this.markOneOfExtensions(schema);
52-
},
53-
});
54-
return this.root
39+
const visited = new Set();
40+
class SecondPassVisitor extends SpecificationVisitor {
41+
visit_schema(ctx: SpecificationContext, schema: MaybeRef<OpenAPIV3.SchemaObject>): void {
42+
super.visit_schema(ctx, schema);
43+
if (is_ref(schema)) return;
44+
45+
modifier.simplifySingleMapSchema(schema, visited);
46+
modifier.handleAdditionalPropertiesUndefined(schema);
47+
modifier.markOneOfExtensions(schema);
48+
}
49+
}
50+
traverseSpec(this.root, new SecondPassVisitor());
51+
52+
return this.root;
5553
}
5654

5755
// Converts `additionalProperties: true` or `additionalProperties: {}` to `type: object`.

tools/proto-convert/src/VendorExtensionProcessor.ts

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { OpenAPIV3 } from 'openapi-types';
2-
import { traverse } from './utils/OpenApiTraverser';
2+
import { SpecificationVisitor, SpecificationContext, traverseSpec, MaybeRef, is_ref } from './utils/SpecificationVisitor';
33
import { resolveRef, deleteMatchingKeys, remove_unused } from './utils/helper';
44
import logger from './utils/logger';
55
import _ from 'lodash';
@@ -37,26 +37,24 @@ export class VendorExtensionProcessor {
3737

3838
remove_unused(this.root);
3939

40-
traverse(this.root, {
41-
onParameter: (param: any, name: string) => {
42-
this.applyNameOverrideToParameter(param);
43-
},
44-
onSchema: (schema: any, name: string) => {
45-
this.applyTypeOverride(schema);
46-
this.applyNameOverride(schema);
47-
},
48-
onResponseSchema: (schema: any, name: string) => {
49-
this.applyTypeOverride(schema);
50-
this.applyNameOverride(schema);
51-
},
52-
onRequestSchema: (schema: any, name: string) => {
53-
this.applyTypeOverride(schema);
54-
this.applyNameOverride(schema);
55-
},
56-
onSchemaProperty: (schema: any, name: string) => {
57-
this.applyTypeOverride(schema);
40+
const processor = this;
41+
class VendorExtensionVisitor extends SpecificationVisitor {
42+
visit_schema(ctx: SpecificationContext, schema: MaybeRef<OpenAPIV3.SchemaObject>): void {
43+
super.visit_schema(ctx, schema);
44+
if (is_ref(schema)) return;
45+
46+
processor.applyTypeOverride(schema);
47+
processor.applyNameOverride(schema);
5848
}
59-
});
49+
50+
visit_parameter(ctx: SpecificationContext, param: MaybeRef<OpenAPIV3.ParameterObject>): void {
51+
super.visit_parameter(ctx, param);
52+
if (is_ref(param)) return;
53+
54+
processor.applyNameOverrideToParameter(param);
55+
}
56+
}
57+
traverseSpec(this.root, new VendorExtensionVisitor());
6058

6159
return this.root;
6260
}

tools/proto-convert/src/utils/OpenApiTraverser.ts

Lines changed: 0 additions & 121 deletions
This file was deleted.

0 commit comments

Comments
 (0)