From 6c34c118594f8373ee8a3fd3087a839a824df10a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Urba=C5=84czyk?= Date: Thu, 29 Sep 2022 10:18:09 +0200 Subject: [PATCH] feat: support 2.5.0 AsyncAPI (#144) --- src/convert.ts | 14 ++-- src/interfaces.ts | 2 +- test/convert.spec.ts | 21 ++++++ test/input/2.4.0/streetlights.yml | 112 +++++++++++++++++++++++++++++ test/output/2.5.0/streetlights.yml | 112 +++++++++++++++++++++++++++++ 5 files changed, 256 insertions(+), 5 deletions(-) create mode 100644 test/input/2.4.0/streetlights.yml create mode 100644 test/output/2.5.0/streetlights.yml diff --git a/src/convert.ts b/src/convert.ts index 1689fec0..17b0a120 100644 --- a/src/convert.ts +++ b/src/convert.ts @@ -24,12 +24,13 @@ import type { AsyncAPIDocument, ConvertVersion, ConvertOptions } from './interfa '2.2.0': from__2_1_0__to__2_2_0, '2.3.0': from__2_2_0__to__2_3_0, '2.4.0': from__2_3_0__to__2_4_0, + '2.5.0': from__2_4_0__to__2_5_0, }; const conversionVersions = Object.keys(conversions); -export function convert(asyncapi: string, version: ConvertVersion, options?: ConvertOptions): string; -export function convert(asyncapi: AsyncAPIDocument, version: ConvertVersion, options?: ConvertOptions): AsyncAPIDocument; -export function convert(asyncapi: string | AsyncAPIDocument, version: ConvertVersion, options: ConvertOptions = {}): string | AsyncAPIDocument { +export function convert(asyncapi: string, version?: ConvertVersion, options?: ConvertOptions): string; +export function convert(asyncapi: AsyncAPIDocument, version?: ConvertVersion, options?: ConvertOptions): AsyncAPIDocument; +export function convert(asyncapi: string | AsyncAPIDocument, version: ConvertVersion = '2.5.0', options: ConvertOptions = {}): string | AsyncAPIDocument { const { format, document } = serializeInput(asyncapi); const asyncapiVersion = document.asyncapi; @@ -215,4 +216,9 @@ function from__2_2_0__to__2_3_0(asyncapi: AsyncAPIDocument, _: ConvertOptions) { function from__2_3_0__to__2_4_0(asyncapi: AsyncAPIDocument, _: ConvertOptions) { asyncapi.asyncapi = '2.4.0'; return asyncapi; -} \ No newline at end of file +} + +function from__2_4_0__to__2_5_0(asyncapi: AsyncAPIDocument, _: ConvertOptions) { + asyncapi.asyncapi = '2.5.0'; + return asyncapi; +} diff --git a/src/interfaces.ts b/src/interfaces.ts index 33a552d6..980809d0 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -1,3 +1,3 @@ export type AsyncAPIDocument = { asyncapi: string } & Record; -export type ConvertVersion = '1.1.0' | '1.2.0' | '2.0.0-rc1' | '2.0.0-rc2' | '2.0.0' | '2.1.0' | '2.2.0' | '2.3.0' | '2.4.0'; +export type ConvertVersion = '1.1.0' | '1.2.0' | '2.0.0-rc1' | '2.0.0-rc2' | '2.0.0' | '2.1.0' | '2.2.0' | '2.3.0' | '2.4.0' | '2.5.0'; export interface ConvertOptions {} diff --git a/test/convert.spec.ts b/test/convert.spec.ts index 842313e4..9403e5c5 100644 --- a/test/convert.spec.ts +++ b/test/convert.spec.ts @@ -205,6 +205,27 @@ it('should convert from 2.3.0 to 2.4.0', () => { assertResults(output, result); }); +it('should convert from 2.3.0 to 2.5.0', () => { + const input = fs.readFileSync(path.resolve(__dirname, 'input', '2.3.0', 'streetlights.yml'), 'utf8'); + const output = fs.readFileSync(path.resolve(__dirname, 'output', '2.5.0', 'streetlights.yml'), 'utf8'); + const result = convert(input, '2.5.0'); + assertResults(output, result); +}); + +it('should convert from 2.4.0 to 2.5.0', () => { + const input = fs.readFileSync(path.resolve(__dirname, 'input', '2.4.0', 'streetlights.yml'), 'utf8'); + const output = fs.readFileSync(path.resolve(__dirname, 'output', '2.5.0', 'streetlights.yml'), 'utf8'); + const result = convert(input, '2.5.0'); + assertResults(output, result); +}); + +it('should convert from 2.0.0 to latest', () => { + const input = fs.readFileSync(path.resolve(__dirname, 'input', '2.0.0', 'streetlights.yml'), 'utf8'); + const output = fs.readFileSync(path.resolve(__dirname, 'output', '2.5.0', 'streetlights.yml'), 'utf8'); + const result = convert(input); + assertResults(output, result); +}); + it('should convert from 2.0.0 to 2.1.0 (JSON case)', () => { const input = fs.readFileSync(path.resolve(__dirname, 'input', '2.0.0', 'streetlights.json'), 'utf8'); let output = fs.readFileSync(path.resolve(__dirname, 'output', '2.1.0', 'streetlights.json'), 'utf8'); diff --git a/test/input/2.4.0/streetlights.yml b/test/input/2.4.0/streetlights.yml new file mode 100644 index 00000000..67913f4a --- /dev/null +++ b/test/input/2.4.0/streetlights.yml @@ -0,0 +1,112 @@ +asyncapi: 2.4.0 +info: + title: Streetlights API + version: 1.0.0 + description: "The Smartylighting Streetlights API allows you to remotely manage the city lights.\n\n### Check out its awesome features:\n\n* Turn a specific streetlight on/off \U0001F303\n* Dim a specific streetlight \U0001F60E\n* Receive real-time information about environmental lighting conditions \U0001F4C8\n" + license: + name: Apache 2.0 + url: 'https://www.apache.org/licenses/LICENSE-2.0' +servers: + default: + url: 'api.streetlights.smartylighting.com:{port}' + description: Test broker + variables: + port: + description: Secure connection (TLS) is available through port 8883. + default: '1883' + enum: + - '1883' + - '8883' + protocol: mqtt + security: + - apiKey: [] +components: + messages: + lightMeasured: + summary: >- + Inform about environmental lighting conditions for a particular + streetlight. + payload: + $ref: '#/components/schemas/lightMeasuredPayload' + turnOnOff: + summary: Command a particular streetlight to turn the lights on or off. + payload: + $ref: '#/components/schemas/turnOnOffPayload' + dimLight: + summary: Command a particular streetlight to dim the lights. + payload: + $ref: '#/components/schemas/dimLightPayload' + schemas: + lightMeasuredPayload: + type: object + properties: + lumens: + type: integer + minimum: 0 + description: Light intensity measured in lumens. + sentAt: + $ref: '#/components/schemas/sentAt' + turnOnOffPayload: + type: object + properties: + command: + type: string + enum: + - 'on' + - 'off' + description: Whether to turn on or off the light. + sentAt: + $ref: '#/components/schemas/sentAt' + dimLightPayload: + type: object + properties: + percentage: + type: integer + description: Percentage to which the light should be dimmed to. + minimum: 0 + maximum: 100 + sentAt: + $ref: '#/components/schemas/sentAt' + sentAt: + type: string + format: date-time + description: Date and time when the message was sent. + securitySchemes: + apiKey: + type: apiKey + in: user + description: Provide your API key as the user and leave the password empty. + parameters: + streetlightId: + description: The ID of the streetlight. + schema: + type: string +channels: + 'smartylighting/streetlights/1/0/event/{streetlightId}/lighting/measured': + parameters: + streetlightId: + $ref: '#/components/parameters/streetlightId' + publish: + message: + $ref: '#/components/messages/lightMeasured' + 'smartylighting/streetlights/1/0/action/{streetlightId}/turn/on': + parameters: + streetlightId: + $ref: '#/components/parameters/streetlightId' + subscribe: + message: + $ref: '#/components/messages/turnOnOff' + 'smartylighting/streetlights/1/0/action/{streetlightId}/turn/off': + parameters: + streetlightId: + $ref: '#/components/parameters/streetlightId' + subscribe: + message: + $ref: '#/components/messages/turnOnOff' + 'smartylighting/streetlights/1/0/action/{streetlightId}/dim': + parameters: + streetlightId: + $ref: '#/components/parameters/streetlightId' + subscribe: + message: + $ref: '#/components/messages/dimLight' diff --git a/test/output/2.5.0/streetlights.yml b/test/output/2.5.0/streetlights.yml new file mode 100644 index 00000000..2285d2e6 --- /dev/null +++ b/test/output/2.5.0/streetlights.yml @@ -0,0 +1,112 @@ +asyncapi: 2.5.0 +info: + title: Streetlights API + version: 1.0.0 + description: "The Smartylighting Streetlights API allows you to remotely manage the city lights.\n\n### Check out its awesome features:\n\n* Turn a specific streetlight on/off \U0001F303\n* Dim a specific streetlight \U0001F60E\n* Receive real-time information about environmental lighting conditions \U0001F4C8\n" + license: + name: Apache 2.0 + url: 'https://www.apache.org/licenses/LICENSE-2.0' +servers: + default: + url: 'api.streetlights.smartylighting.com:{port}' + description: Test broker + variables: + port: + description: Secure connection (TLS) is available through port 8883. + default: '1883' + enum: + - '1883' + - '8883' + protocol: mqtt + security: + - apiKey: [] +components: + messages: + lightMeasured: + summary: >- + Inform about environmental lighting conditions for a particular + streetlight. + payload: + $ref: '#/components/schemas/lightMeasuredPayload' + turnOnOff: + summary: Command a particular streetlight to turn the lights on or off. + payload: + $ref: '#/components/schemas/turnOnOffPayload' + dimLight: + summary: Command a particular streetlight to dim the lights. + payload: + $ref: '#/components/schemas/dimLightPayload' + schemas: + lightMeasuredPayload: + type: object + properties: + lumens: + type: integer + minimum: 0 + description: Light intensity measured in lumens. + sentAt: + $ref: '#/components/schemas/sentAt' + turnOnOffPayload: + type: object + properties: + command: + type: string + enum: + - 'on' + - 'off' + description: Whether to turn on or off the light. + sentAt: + $ref: '#/components/schemas/sentAt' + dimLightPayload: + type: object + properties: + percentage: + type: integer + description: Percentage to which the light should be dimmed to. + minimum: 0 + maximum: 100 + sentAt: + $ref: '#/components/schemas/sentAt' + sentAt: + type: string + format: date-time + description: Date and time when the message was sent. + securitySchemes: + apiKey: + type: apiKey + in: user + description: Provide your API key as the user and leave the password empty. + parameters: + streetlightId: + description: The ID of the streetlight. + schema: + type: string +channels: + 'smartylighting/streetlights/1/0/event/{streetlightId}/lighting/measured': + parameters: + streetlightId: + $ref: '#/components/parameters/streetlightId' + publish: + message: + $ref: '#/components/messages/lightMeasured' + 'smartylighting/streetlights/1/0/action/{streetlightId}/turn/on': + parameters: + streetlightId: + $ref: '#/components/parameters/streetlightId' + subscribe: + message: + $ref: '#/components/messages/turnOnOff' + 'smartylighting/streetlights/1/0/action/{streetlightId}/turn/off': + parameters: + streetlightId: + $ref: '#/components/parameters/streetlightId' + subscribe: + message: + $ref: '#/components/messages/turnOnOff' + 'smartylighting/streetlights/1/0/action/{streetlightId}/dim': + parameters: + streetlightId: + $ref: '#/components/parameters/streetlightId' + subscribe: + message: + $ref: '#/components/messages/dimLight'