Skip to content

Commit 3627d02

Browse files
magicmatatjahuderberg
authored andcommitted
refactor: port message, operation, correlation-id and security-requirements models (#542)
1 parent e444b87 commit 3627d02

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

69 files changed

+1884
-399
lines changed

src/models/asyncapi.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ export interface AsyncAPIDocumentInterface extends BaseModel, ExtensionsMixinInt
1616
export function newAsyncAPIDocument(asyncapi: DetailedAsyncAPI): AsyncAPIDocumentInterface {
1717
switch (asyncapi.semver.major) {
1818
case 2:
19-
return new AsyncAPIDocumentV2(asyncapi.parsed, { parent: null, asyncapi, pointer: '/' });
19+
return new AsyncAPIDocumentV2(asyncapi.parsed, { asyncapi, pointer: '/' });
2020
case 3:
21-
return new AsyncAPIDocumentV3(asyncapi.parsed, { parent: null, asyncapi, pointer: '/' });
21+
return new AsyncAPIDocumentV3(asyncapi.parsed, { asyncapi, pointer: '/' });
2222
default:
2323
throw new Error(`Unsupported AsyncAPI version: ${asyncapi.semver.version}`);
2424
}

src/models/base.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import type { Constructor } from "./utils";
22
import type { DetailedAsyncAPI } from "../types";
33

4-
export interface ModelMetadata<P = unknown> {
4+
export interface ModelMetadata {
55
asyncapi: DetailedAsyncAPI;
66
pointer: string;
7-
parent: P | null;
7+
[key: string]: any;
88
}
99

1010
export abstract class BaseModel {
@@ -32,8 +32,8 @@ export abstract class BaseModel {
3232
return `${this._meta?.pointer}/${field}`;
3333
}
3434

35-
protected createModel<T extends BaseModel>(Model: Constructor<T>, value: any, { id, parent, pointer }: { id?: string, parent?: any, pointer: string | number }): T {
36-
const meta = { asyncapi: this._meta.asyncapi, parent: parent || this, pointer } as ModelMetadata;
35+
protected createModel<T extends BaseModel>(Model: Constructor<T>, value: any, { id, parent, pointer, ...rest }: { id?: string, pointer: string | number, [key: string]: any }): T {
36+
const meta = { ...rest, asyncapi: this._meta.asyncapi, pointer } as ModelMetadata;
3737
if (id) {
3838
return new Model(id, value, meta);
3939
}

src/models/channel-parameter.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
11
import type { BaseModel } from "./base";
2+
import type { DescriptionMixinInterface, ExtensionsMixinInterface } from "./mixins";
3+
import type { SchemaInterface } from "./schema";
24

3-
export interface ChannelParameterInterface extends BaseModel {}
5+
export interface ChannelParameterInterface extends BaseModel, DescriptionMixinInterface, ExtensionsMixinInterface {
6+
id(): string;
7+
hasSchema(): boolean;
8+
schema(): SchemaInterface | undefined;
9+
hasLocation(): boolean;
10+
location(): string | undefined;
11+
}

src/models/channel.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
11
import type { BaseModel } from "./base";
2+
import type { ChannelParametersInterface } from "./channel-parameters";
3+
import type { BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface } from "./mixins";
4+
import type { OperationsInterface } from "./operations";
5+
import type { ServersInterface } from "./servers";
26

3-
export interface ChannelInterface extends BaseModel {}
7+
export interface ChannelInterface extends BaseModel, BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface {
8+
id(): string;
9+
address(): string;
10+
servers(): ServersInterface;
11+
operations(): OperationsInterface;
12+
parameters(): ChannelParametersInterface;
13+
}

src/models/components.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@ import type { Collection } from './collection';
33
import type { ServersInterface } from './servers';
44
import type { ChannelsInterface } from './channels';
55
import type { OperationsInterface } from './operations';
6-
import type { OperationsTraitsInterface } from './operation-traits';
6+
import type { OperationTraitsInterface } from './operation-traits';
77
import type { MessagesInterface } from './messages';
8-
import type { MessagesTraitsInterface } from './message-traits';
8+
import type { MessageTraitsInterface } from './message-traits';
99
import type { SchemasInterface } from './schemas';
1010
import type { ChannelParametersInterface } from './channel-parameters';
1111
import type { ServerVariablesInterface } from './server-variables';
1212
import type { CorrelationIdInterface } from './correlation-id';
1313
import type { BindingsInterface } from './bindings';
14+
import type { SecuritySchemesInterface } from './security-schemes';
1415
import type { ExtensionsMixinInterface } from './mixins';
1516

1617
export interface Components extends BaseModel, ExtensionsMixinInterface {
@@ -21,10 +22,10 @@ export interface Components extends BaseModel, ExtensionsMixinInterface {
2122
schemas(): SchemasInterface;
2223
channelParameters(): ChannelParametersInterface;
2324
serverVariables(): ServerVariablesInterface;
24-
operationTraits(): OperationsTraitsInterface;
25-
messageTraits(): MessagesTraitsInterface;
25+
operationTraits(): OperationTraitsInterface;
26+
messageTraits(): MessageTraitsInterface;
2627
correlationIds(): Collection<CorrelationIdInterface>;
27-
securitySchemes(): any; // TODO: Fix type after merging Souvik PR
28+
securitySchemes(): SecuritySchemesInterface;
2829
serverBindings(): Collection<BindingsInterface>;
2930
channelBindings(): Collection<BindingsInterface>;
3031
operationBindings(): Collection<BindingsInterface>;

src/models/correlation-id.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
import type { BaseModel } from "./base";
2+
import type { DescriptionMixinInterface, ExtensionsMixinInterface } from "./mixins";
23

3-
export interface CorrelationIdInterface extends BaseModel {}
4+
export interface CorrelationIdInterface extends BaseModel, DescriptionMixinInterface, ExtensionsMixinInterface {
5+
hasLocation(): boolean;
6+
location(): string | undefined;
7+
}

src/models/message-example.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
11
import type { BaseModel } from "./base";
2+
import type { ExtensionsMixinInterface } from './mixins';
23

3-
export interface MessageExample extends BaseModel {}
4+
export interface MessageExampleInterface extends BaseModel, ExtensionsMixinInterface {
5+
hasName(): boolean;
6+
name(): string;
7+
hasSummary(): boolean;
8+
summary(): string;
9+
hasHeaders(): boolean;
10+
headers(): Record<string, any> | undefined;
11+
hasPayload(): boolean;
12+
payload(): Record<string, any> | undefined;
13+
}

src/models/message-examples.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import type { Collection } from "./collection";
2+
import type { MessageExampleInterface } from "./message-example";
3+
4+
export interface MessageExamplesInterface extends Collection<MessageExampleInterface> {}

src/models/message-trait.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,24 @@
11
import type { BaseModel } from "./base";
2+
import type { CorrelationIdInterface } from "./correlation-id";
3+
import type { MessageExamplesInterface } from "./message-examples";
4+
import type { BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface, ExternalDocumentationMixinInterface, TagsMixinInterface } from './mixins';
5+
import type { SchemaInterface } from "./schema";
26

3-
export interface MessageTraitInterface extends BaseModel {}
7+
export interface MessageTraitInterface extends BaseModel, BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface, ExternalDocumentationMixinInterface, TagsMixinInterface {
8+
id(): string;
9+
hasMessageId(): boolean;
10+
messageId(): string | undefined;
11+
hasCorrelationId(): boolean;
12+
correlationId(): CorrelationIdInterface | undefined;
13+
hasContentType(): boolean;
14+
contentType(): string | undefined;
15+
hasHeaders(): boolean
16+
headers(): SchemaInterface | undefined;
17+
hasName(): boolean;
18+
name(): string | undefined;
19+
hasTitle(): boolean;
20+
title(): string | undefined;
21+
hasSummary(): boolean;
22+
summary(): string | undefined;
23+
examples(): MessageExamplesInterface;
24+
}

src/models/message-traits.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
import type { Collection } from "./collection";
22
import type { MessageTraitInterface } from "./message-trait";
33

4-
export interface MessagesTraitsInterface extends Collection<MessageTraitInterface> {}
4+
export interface MessageTraitsInterface extends Collection<MessageTraitInterface> {}

src/models/message.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
import type { BaseModel } from "./base";
2+
import type { MessageTraitsInterface } from "./message-traits";
23
import type { MessageTraitInterface } from "./message-trait";
4+
import type { SchemaInterface } from "./schema";
35

4-
export interface MessageInterface extends BaseModel, MessageTraitInterface {}
6+
export interface MessageInterface extends BaseModel, MessageTraitInterface {
7+
hasPayload(): boolean;
8+
payload(): SchemaInterface | undefined;
9+
traits(): MessageTraitsInterface;
10+
}

src/models/oauth-flow.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import { BaseModel } from './base';
22
import { ExtensionsMixinInterface } from './mixins';
33

44
export interface OAuthFlowInterface extends BaseModel, ExtensionsMixinInterface {
5-
authorizationUrl(): string | undefined;
6-
hasRefreshUrl(): boolean;
7-
refreshUrl(): string | undefined;
8-
scopes(): Record<string, string> | undefined;
9-
tokenUrl(): string | undefined;
10-
}
5+
authorizationUrl(): string | undefined;
6+
hasRefreshUrl(): boolean;
7+
refreshUrl(): string | undefined;
8+
scopes(): Record<string, string> | undefined;
9+
tokenUrl(): string | undefined;
10+
}

src/models/oauth-flows.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
import { OAuthFlowInterface } from './oauth-flow';
2-
import { BaseModel } from './base';
3-
import {ExtensionsMixinInterface} from './mixins';
1+
import type { BaseModel } from './base';
2+
import type { OAuthFlowInterface } from './oauth-flow';
3+
import type { ExtensionsMixinInterface } from './mixins';
44

55
export interface OAuthFlowsInterface extends BaseModel, ExtensionsMixinInterface {
6-
hasAuthorizationCode(): boolean;
7-
authorizationCode(): OAuthFlowInterface | undefined;
8-
hasClientCredentials(): boolean
9-
clientCredentials(): OAuthFlowInterface | undefined;
10-
hasImplicit(): boolean;
11-
implicit(): OAuthFlowInterface | undefined;
12-
hasPassword(): boolean;
13-
password(): OAuthFlowInterface | undefined;
14-
}
6+
hasAuthorizationCode(): boolean;
7+
authorizationCode(): OAuthFlowInterface | undefined;
8+
hasClientCredentials(): boolean
9+
clientCredentials(): OAuthFlowInterface | undefined;
10+
hasImplicit(): boolean;
11+
implicit(): OAuthFlowInterface | undefined;
12+
hasPassword(): boolean;
13+
password(): OAuthFlowInterface | undefined;
14+
}

src/models/operation-trait.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
11
import type { BaseModel } from "./base";
2+
import type { BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface, ExternalDocumentationMixinInterface, TagsMixinInterface } from './mixins';
3+
import type { OperationAction } from "./operation";
4+
import type { SecuritySchemeInterface } from "./security-scheme";
25

3-
export interface OperationTraitInterface extends BaseModel {}
6+
export interface OperationTraitInterface extends BaseModel, BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface, ExternalDocumentationMixinInterface, TagsMixinInterface {
7+
id(): string;
8+
action(): OperationAction;
9+
hasOperationId(): boolean;
10+
operationId(): string | undefined;
11+
hasSummary(): boolean;
12+
summary(): string | undefined;
13+
security(): Array<Record<string, { schema: SecuritySchemeInterface; scopes: string[]; }>>;
14+
}

src/models/operation-traits.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
import type { Collection } from "./collection";
22
import type { OperationTraitInterface } from "./operation-trait";
33

4-
export interface OperationsTraitsInterface extends Collection<OperationTraitInterface> {}
4+
export interface OperationTraitsInterface extends Collection<OperationTraitInterface> {}

src/models/operation.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
11
import type { BaseModel } from "./base";
2+
import type { MessagesInterface } from "./messages";
3+
import type { OperationTraitsInterface } from "./operation-traits";
24
import type { OperationTraitInterface } from "./operation-trait";
35

4-
export interface OperationInterface extends BaseModel, OperationTraitInterface {}
6+
export type OperationAction = 'send' | 'receive' | 'publish' | 'subscribe';
7+
8+
export interface OperationInterface extends BaseModel, OperationTraitInterface {
9+
messages(): MessagesInterface;
10+
traits(): OperationTraitsInterface;
11+
}

src/models/schema.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
import type { BaseModel } from "./base";
2+
import type { ExtensionsMixinInterface } from "./mixins";
23

3-
export interface SchemaInterface extends BaseModel {}
4+
export interface SchemaInterface extends BaseModel, ExtensionsMixinInterface {}

src/models/security-scheme.ts

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
1-
import { BaseModel } from './base';
2-
import { DescriptionMixinInterface, ExtensionsMixinInterface } from './mixins';
3-
import { OAuthFlowsInterface } from './oauth-flows';
1+
import type { BaseModel } from './base';
2+
import type { OAuthFlowsInterface } from './oauth-flows';
3+
import type { DescriptionMixinInterface, ExtensionsMixinInterface } from './mixins';
44

55
export type SecuritySchemaType = 'userPassword' | 'apiKey' | 'X509' | 'symmetricEncryption' | 'asymmetricEncryption' | 'httpApiKey' | 'http' | 'oauth2' | 'openIdConnect' | 'plain' | 'scramSha256' | 'scramSha512' | 'gssapi';
66

7-
87
export interface SecuritySchemeInterface extends BaseModel, DescriptionMixinInterface, ExtensionsMixinInterface {
9-
id(): string
10-
hasBearerFormat(): boolean;
11-
bearerFormat(): string | undefined;
12-
openIdConnectUrl(): string;
13-
scheme(): string | undefined;
14-
flows(): OAuthFlowsInterface | undefined;
15-
scopes(): string[];
16-
type(): SecuritySchemaType;
17-
in(): string | undefined;
18-
}
8+
id(): string
9+
hasBearerFormat(): boolean;
10+
bearerFormat(): string | undefined;
11+
openIdConnectUrl(): string;
12+
scheme(): string | undefined;
13+
flows(): OAuthFlowsInterface | undefined;
14+
scopes(): string[];
15+
type(): SecuritySchemaType;
16+
in(): string | undefined;
17+
}

src/models/security-schemes.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {Collection} from './collection';
2-
import { SecuritySchemeInterface } from './security-scheme';
1+
import type { Collection} from './collection';
2+
import type { SecuritySchemeInterface } from './security-scheme';
33

4-
export interface SecuritySchemesInterface extends Collection<SecuritySchemeInterface> {}
4+
export interface SecuritySchemesInterface extends Collection<SecuritySchemeInterface> {}

src/models/server-variable.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export interface ServerVariableInterface extends BaseModel, DescriptionMixinInte
55
id(): string;
66
hasDefaultValue(): boolean;
77
defaultValue(): string | undefined;
8-
hasAllowedValue(): boolean;
9-
allowedValue(): Array<string>;
8+
hasAllowedValues(): boolean;
9+
allowedValues(): Array<string>;
1010
examples(): Array<string>;
1111
}

src/models/server.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import type { BaseModel } from "./base";
22
import type { BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface } from './mixins';
33
import type { ServerVariablesInterface } from "./server-variables";
4+
import type { SecuritySchemeInterface } from "./security-scheme";
45

56
export interface ServerInterface extends BaseModel, DescriptionMixinInterface, BindingsMixinInterface, ExtensionsMixinInterface {
67
id(): string
78
url(): string;
8-
protocol(): string | undefined;
9+
protocol(): string;
910
protocolVersion(): string;
1011
hasProtocolVersion(): boolean;
11-
variables(): ServerVariablesInterface
12-
}
12+
variables(): ServerVariablesInterface;
13+
security(): Array<Record<string, { schema: SecuritySchemeInterface; scopes: string[]; }>>;
14+
}

src/models/v2/asyncapi.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,7 @@ import { ExtensionsMixin } from './mixins/extensions';
99
import type { AsyncAPIDocumentInterface, InfoInterface } from "../../models";
1010
import type { ServersInterface } from "models/servers";
1111

12-
export class AsyncAPIDocument
13-
extends Mixin(BaseModel, ExtensionsMixin)
14-
implements AsyncAPIDocumentInterface {
15-
12+
export class AsyncAPIDocument extends Mixin(BaseModel, ExtensionsMixin) implements AsyncAPIDocumentInterface {
1613
version(): string {
1714
return this._json.asyncapi;
1815
}

src/models/v2/correlation-id.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { BaseModel } from "../base";
2+
3+
import { Mixin } from '../utils';
4+
import { DescriptionMixin } from './mixins/description';
5+
import { ExtensionsMixin } from './mixins/extensions';
6+
7+
import type { CorrelationIdInterface } from "../correlation-id";
8+
9+
export class CorrelationId extends Mixin(BaseModel, DescriptionMixin, ExtensionsMixin) implements CorrelationIdInterface {
10+
hasLocation(): boolean {
11+
return !!this._json.location;
12+
}
13+
14+
location(): string | undefined {
15+
return this._json.location;
16+
}
17+
}

src/models/v2/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@ export { SecurityScheme as SecuritySchemeV2 } from './security-scheme';
1212
export { SecuritySchemes as SecuritySchemesV2 } from './security-schemes';
1313
export { ServerVariable as ServerVariableV2 } from './server-variable';
1414
export { ServerVariables as ServerVariablesV2 } from './server-variables';
15-
export {OAuthFlow as OAuthFlowV2} from './oauth-flow';
16-
export {OAuthFlows as OAuthFlowsV2} from './oauth-flows';
15+
export { OAuthFlow as OAuthFlowV2 } from './oauth-flow';
16+
export { OAuthFlows as OAuthFlowsV2 } from './oauth-flows';

0 commit comments

Comments
 (0)