Skip to content

Commit 7fc5916

Browse files
magicmatatjahuderberg
authored andcommitted
refactor: port components model (#548)
1 parent ae4b0ff commit 7fc5916

File tree

7 files changed

+406
-32
lines changed

7 files changed

+406
-32
lines changed

src/models/components.ts

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,30 @@
11
import type { BaseModel } from './base';
2-
import type { Collection } from './collection';
3-
import type { ServersInterface } from './servers';
4-
import type { ChannelsInterface } from './channels';
5-
import type { OperationsInterface } from './operations';
6-
import type { OperationTraitsInterface } from './operation-traits';
7-
import type { MessagesInterface } from './messages';
8-
import type { MessageTraitsInterface } from './message-traits';
9-
import type { SchemasInterface } from './schemas';
10-
import type { ChannelParametersInterface } from './channel-parameters';
11-
import type { ServerVariablesInterface } from './server-variables';
2+
import type { ServerInterface } from './server';
3+
import type { ChannelInterface } from './channel';
4+
import type { OperationTraitInterface } from './operation-trait';
5+
import type { MessageInterface } from './message';
6+
import type { MessageTraitInterface } from './message-trait';
7+
import type { SchemaInterface } from './schema';
8+
import type { ChannelParameterInterface } from './channel-parameter';
9+
import type { ServerVariableInterface } from './server-variable';
1210
import type { CorrelationIdInterface } from './correlation-id';
1311
import type { BindingsInterface } from './bindings';
14-
import type { SecuritySchemesInterface } from './security-schemes';
12+
import type { SecuritySchemeInterface } from './security-scheme';
1513
import type { ExtensionsMixinInterface } from './mixins';
1614

17-
export interface Components extends BaseModel, ExtensionsMixinInterface {
18-
servers(): ServersInterface;
19-
channels(): ChannelsInterface;
20-
operations(): OperationsInterface;
21-
messages(): MessagesInterface;
22-
schemas(): SchemasInterface;
23-
channelParameters(): ChannelParametersInterface;
24-
serverVariables(): ServerVariablesInterface;
25-
operationTraits(): OperationTraitsInterface;
26-
messageTraits(): MessageTraitsInterface;
27-
correlationIds(): Collection<CorrelationIdInterface>;
28-
securitySchemes(): SecuritySchemesInterface;
29-
serverBindings(): Collection<BindingsInterface>;
30-
channelBindings(): Collection<BindingsInterface>;
31-
operationBindings(): Collection<BindingsInterface>;
32-
messageBindings(): Collection<BindingsInterface>;
15+
export interface ComponentsInterface extends BaseModel, ExtensionsMixinInterface {
16+
servers(): Record<string, ServerInterface>;
17+
channels(): Record<string, ChannelInterface>;
18+
messages(): Record<string, MessageInterface>;
19+
schemas(): Record<string, SchemaInterface>;
20+
channelParameters(): Record<string, ChannelParameterInterface>;
21+
serverVariables(): Record<string, ServerVariableInterface>;
22+
operationTraits(): Record<string, OperationTraitInterface>;
23+
messageTraits(): Record<string, MessageTraitInterface>;
24+
correlationIds(): Record<string, CorrelationIdInterface>;
25+
securitySchemes(): Record<string, SecuritySchemeInterface>;
26+
serverBindings(): Record<string, BindingsInterface>;
27+
channelBindings(): Record<string, BindingsInterface>;
28+
operationBindings(): Record<string, BindingsInterface>;
29+
messageBindings(): Record<string, BindingsInterface>;
3330
}

src/models/v2/asyncapi.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export class AsyncAPIDocument extends Mixin(BaseModel, ExtensionsMixin) implemen
2020

2121
servers(): ServersInterface {
2222
return new Servers(
23-
Object.entries(this._json.servers).map(([serverName, server]) =>
23+
Object.entries(this._json.servers || {}).map(([serverName, server]) =>
2424
this.createModel(Server, server, { id: serverName, pointer: `/servers/${serverName}` })
2525
)
2626
);

src/models/v2/components.ts

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import { BaseModel } from "../base";
2+
import { Channel } from "./channel";
3+
import { ChannelParameter } from "./channel-parameter";
4+
import { CorrelationId } from "./correlation-id";
5+
import { Message } from "./message";
6+
import { MessageTrait } from "./message-trait";
7+
import { OperationTrait } from "./operation-trait";
8+
import { Schema } from "./schema";
9+
import { SecurityScheme } from "./security-scheme";
10+
import { Server } from "./server";
11+
import { ServerVariable } from "./server-variable";
12+
13+
import { Mixin } from '../utils';
14+
import { Bindings, Binding } from "./mixins/bindings";
15+
import { ExtensionsMixin } from './mixins/extensions';
16+
17+
import type { BindingsInterface } from "../bindings";
18+
import type { ComponentsInterface } from "../components";
19+
import type { ChannelInterface } from "../channel";
20+
import type { ChannelParameterInterface } from "../channel-parameter";
21+
import type { CorrelationIdInterface } from "../correlation-id";
22+
import type { MessageInterface } from "../message";
23+
import type { MessageTraitInterface } from "../message-trait";
24+
import type { OperationTraitInterface } from "../operation-trait";
25+
import type { SchemaInterface } from "../schema";
26+
import type { SecuritySchemeInterface } from "../security-scheme";
27+
import type { ServerInterface } from "../server";
28+
import type { ServerVariableInterface } from "../server-variable";
29+
import type { Constructor } from "../utils";
30+
31+
export class Components extends Mixin(BaseModel, ExtensionsMixin) implements ComponentsInterface {
32+
servers(): Record<string, ServerInterface> {
33+
return this.createMap('servers', Server);
34+
}
35+
36+
channels(): Record<string, ChannelInterface> {
37+
return this.createMap('channels', Channel);
38+
}
39+
40+
messages(): Record<string, MessageInterface> {
41+
return this.createMap('messages', Message);
42+
}
43+
44+
schemas(): Record<string, SchemaInterface> {
45+
return this.createMap('schemas', Schema);
46+
}
47+
48+
channelParameters(): Record<string, ChannelParameterInterface> {
49+
return this.createMap('parameters', ChannelParameter);
50+
}
51+
52+
serverVariables(): Record<string, ServerVariableInterface> {
53+
return this.createMap('serverVariables', ServerVariable);
54+
}
55+
56+
operationTraits(): Record<string, OperationTraitInterface> {
57+
return this.createMap('operationTraits', OperationTrait);
58+
}
59+
60+
messageTraits(): Record<string, MessageTraitInterface> {
61+
return this.createMap('messageTraits', MessageTrait);
62+
}
63+
64+
correlationIds(): Record<string, CorrelationIdInterface> {
65+
return this.createMap('correlationIds', CorrelationId);
66+
}
67+
68+
securitySchemes(): Record<string, SecuritySchemeInterface> {
69+
return this.createMap('securitySchemes', SecurityScheme);
70+
}
71+
72+
serverBindings(): Record<string, BindingsInterface> {
73+
return this.createBindings('serverBindings');
74+
}
75+
76+
channelBindings(): Record<string, BindingsInterface> {
77+
return this.createBindings('channelBindings');
78+
}
79+
80+
operationBindings(): Record<string, BindingsInterface> {
81+
return this.createBindings('operationBindings');
82+
}
83+
84+
messageBindings(): Record<string, BindingsInterface> {
85+
return this.createBindings('messageBindings');
86+
}
87+
88+
protected createMap<M extends BaseModel>(itemsName: string, model: Constructor<M>): Record<string, M> {
89+
return Object.entries(this._json[itemsName] || {}).reduce((items, [itemName, item]) => {
90+
items[itemName] = this.createModel(model, item, { id: itemName, pointer: `/components/${itemsName}/${itemName}` })
91+
return items;
92+
}, {} as Record<string, M>);
93+
}
94+
95+
protected createBindings(itemsName: string): Record<string, BindingsInterface> {
96+
return Object.entries(this._json[itemsName] || {}).reduce((bindings, [name, item]) => {
97+
bindings[name] = new Bindings(
98+
Object.entries(item as any || {}).map(([protocol, binding]) =>
99+
this.createModel(Binding, binding, { id: protocol, pointer: `components/${itemsName}/${name}/${protocol}` })
100+
)
101+
);
102+
return bindings;
103+
}, {} as Record<string, BindingsInterface>);
104+
}
105+
}

src/models/v2/mixins/bindings.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,8 @@ export class Bindings extends Collection<BindingInterface> implements BindingsIn
4444

4545
export abstract class BindingsMixin extends BaseModel implements BindingsMixinInterface {
4646
bindings(): BindingsInterface {
47-
const bindings: Record<string, any> = this._json.bindings || {};
4847
return new Bindings(
49-
Object.entries(bindings).map(([protocol, binding]) =>
48+
Object.entries(this._json.bindings || {}).map(([protocol, binding]) =>
5049
this.createModel(Binding, binding, { id: protocol, pointer: `${this._meta.pointer}/bindings/${protocol}` })
5150
)
5251
);

src/models/v2/mixins/tags.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,8 @@ export class Tags extends Collection<TagInterface> implements TagsInterface {
2828

2929
export abstract class TagsMixin extends BaseModel implements TagsMixinInterface {
3030
tags(): TagsInterface {
31-
const tags = this._json.tags || [];
3231
return new Tags(
33-
tags.map((tag: any, idx: number) =>
32+
(this._json.tags || []).map((tag: any, idx: number) =>
3433
this.createModel(Tag, tag, { pointer: `${this._meta.pointer}/tags/${idx}` })
3534
)
3635
);

src/models/v2/schemas.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { Collection } from '../collection';
2+
3+
import type { SchemasInterface } from '../schemas';
4+
import type { SchemaInterface } from '../schema';
5+
6+
export class Schemas extends Collection<SchemaInterface> implements SchemasInterface {
7+
override get(id: string): SchemaInterface | undefined {
8+
return this.collections.find(schema => schema.uid() === id);
9+
}
10+
11+
override has(id: string): boolean {
12+
return this.collections.some(schema => schema.uid() === id);
13+
}
14+
}

0 commit comments

Comments
 (0)