This repository was archived by the owner on Oct 17, 2022. It is now read-only.
forked from ferdikoomen/openapi-typescript-codegen
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdiscriminator.ts
44 lines (41 loc) · 1.74 KB
/
discriminator.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
import type { Model } from '../client/interfaces/Model';
import type { OpenApi } from '../openApi/v3/interfaces/OpenApi';
import type { OpenApiDiscriminator } from '../openApi/v3/interfaces/OpenApiDiscriminator';
import { stripNamespace } from '../openApi/v3/parser/stripNamespace';
import type { Dictionary } from './types';
function inverseDictionary(map: Dictionary<string>): Dictionary<string> {
const m2: Dictionary<string> = {};
for (const key in map) {
m2[map[key]] = key;
}
return m2;
}
export function findOneOfParentDiscriminator(openApi: OpenApi, parent?: Model): OpenApiDiscriminator | undefined {
if (openApi.components) {
for (const definitionName in openApi.components.schemas) {
if (openApi.components.schemas.hasOwnProperty(definitionName)) {
const schema = openApi.components.schemas[definitionName];
if (parent && schema.oneOf?.length && schema.discriminator) {
const isPartOf =
schema.oneOf
.map(definition => definition.$ref && stripNamespace(definition.$ref) === parent.name)
.filter(Boolean).length > 0;
if (isPartOf) {
return schema.discriminator;
}
}
}
}
}
return;
}
export function mapPropertyValue(discriminator: OpenApiDiscriminator, parent: Model): string {
if (discriminator.mapping) {
const mapping = inverseDictionary(discriminator.mapping);
const key = Object.keys(mapping).find(item => stripNamespace(item) == parent.name);
if (key && mapping[key]) {
return mapping[key];
}
}
return parent.name;
}