From 8101ef3c90ed1977ca59c2bbaec5097be7cda0c9 Mon Sep 17 00:00:00 2001 From: asyncapi-bot Date: Sun, 23 Jul 2023 02:32:19 +0200 Subject: [PATCH 01/23] chore: update meetings.json and newsrooom_videos.json (#1981) --- config/meetings.json | 6 ------ 1 file changed, 6 deletions(-) diff --git a/config/meetings.json b/config/meetings.json index 6135d1515bf..d3459311b56 100644 --- a/config/meetings.json +++ b/config/meetings.json @@ -1,10 +1,4 @@ [ - { - "title": "Spec 3.0 Meeting", - "calLink": "https://www.google.com/calendar/event?eid=djhsdjZvbmRsampvb2tsYzhkZWFyc3FtYTAgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", - "url": "https://github.com/asyncapi/community/issues/649", - "date": "2023-04-13T15:00:00.000Z" - }, { "title": "Community Meeting", "calLink": "https://www.google.com/calendar/event?eid=MzgwdmZiMTc4cnBmbTUzdWVlbmM4aWYyM2MgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", From 669a61a0ca14c60dcf92a8d26d9318b817bf5341 Mon Sep 17 00:00:00 2001 From: asyncapi-bot Date: Mon, 24 Jul 2023 02:30:57 +0200 Subject: [PATCH 02/23] chore: update meetings.json and newsrooom_videos.json (#1982) --- config/newsroom_videos.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/config/newsroom_videos.json b/config/newsroom_videos.json index 35c05ac0d27..33910029c84 100644 --- a/config/newsroom_videos.json +++ b/config/newsroom_videos.json @@ -5,12 +5,6 @@ "description": "https://github.com/asyncapi/community/issues/790.", "videoId": "a2luTxpmkfs" }, - { - "image_url": "https://i.ytimg.com/vi/5ldSHhDI95E/hqdefault.jpg", - "title": "Spec 3.0 (July 19th 2023)", - "description": "https://github.com/asyncapi/community/issues/761.", - "videoId": "5ldSHhDI95E" - }, { "image_url": "https://i.ytimg.com/vi/GAjlJFXjMh8/hqdefault.jpg", "title": "Design meeting #2", @@ -28,5 +22,11 @@ "title": "Community Meeting (July 11th 2023)", "description": "https://github.com/asyncapi/community/issues/784.", "videoId": "5o5BHJqGxIg" + }, + { + "image_url": "https://i.ytimg.com/vi/Lunp8eSLONc/hqdefault.jpg", + "title": "Spec 3.0 DOCS Meeting (July 6th 2023)", + "description": "https://github.com/asyncapi/community/issues/774.", + "videoId": "Lunp8eSLONc" } ] \ No newline at end of file From 9eceaa543d9af7e44693e015bff106f4d8974dd3 Mon Sep 17 00:00:00 2001 From: asyncapi-bot Date: Mon, 24 Jul 2023 10:52:21 +0200 Subject: [PATCH 03/23] docs(cli): update latest cli documentation (#1983) --- pages/docs/tools/cli/usage.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pages/docs/tools/cli/usage.md b/pages/docs/tools/cli/usage.md index ecca7d51e7c..73a630e7337 100644 --- a/pages/docs/tools/cli/usage.md +++ b/pages/docs/tools/cli/usage.md @@ -29,7 +29,7 @@ $ npm install -g @asyncapi/cli $ asyncapi COMMAND running command... $ asyncapi (--version) -@asyncapi/cli/0.50.2 linux-x64 node-v18.16.1 +@asyncapi/cli/0.51.0 linux-x64 node-v18.16.1 $ asyncapi --help [COMMAND] USAGE $ asyncapi COMMAND @@ -91,7 +91,7 @@ EXAMPLES $ asyncapi bundle ./asyncapi.yaml ./features.yaml --base ./asyncapi.yaml --reference-into-components ``` -_See code: [src/commands/bundle.ts](https://github.com/asyncapi/cli/blob/v0.50.2/src/commands/bundle.ts)_ +_See code: [src/commands/bundle.ts](https://github.com/asyncapi/cli/blob/v0.51.0/src/commands/bundle.ts)_ ## `asyncapi config` @@ -105,7 +105,7 @@ DESCRIPTION CLI config settings ``` -_See code: [src/commands/config/index.ts](https://github.com/asyncapi/cli/blob/v0.50.2/src/commands/config/index.ts)_ +_See code: [src/commands/config/index.ts](https://github.com/asyncapi/cli/blob/v0.51.0/src/commands/config/index.ts)_ ## `asyncapi config context` @@ -234,7 +234,7 @@ DESCRIPTION Convert asyncapi documents older to newer versions ``` -_See code: [src/commands/convert.ts](https://github.com/asyncapi/cli/blob/v0.50.2/src/commands/convert.ts)_ +_See code: [src/commands/convert.ts](https://github.com/asyncapi/cli/blob/v0.51.0/src/commands/convert.ts)_ ## `asyncapi diff OLD NEW` @@ -289,7 +289,7 @@ DESCRIPTION Find diff between two asyncapi files ``` -_See code: [src/commands/diff.ts](https://github.com/asyncapi/cli/blob/v0.50.2/src/commands/diff.ts)_ +_See code: [src/commands/diff.ts](https://github.com/asyncapi/cli/blob/v0.51.0/src/commands/diff.ts)_ ## `asyncapi generate` @@ -303,7 +303,7 @@ DESCRIPTION Generate typed models or other things like clients, applications or docs using AsyncAPI Generator templates. ``` -_See code: [src/commands/generate/index.ts](https://github.com/asyncapi/cli/blob/v0.50.2/src/commands/generate/index.ts)_ +_See code: [src/commands/generate/index.ts](https://github.com/asyncapi/cli/blob/v0.51.0/src/commands/generate/index.ts)_ ## `asyncapi generate fromTemplate ASYNCAPI TEMPLATE` @@ -432,7 +432,7 @@ DESCRIPTION Creates a new asyncapi file ``` -_See code: [src/commands/new/index.ts](https://github.com/asyncapi/cli/blob/v0.50.2/src/commands/new/index.ts)_ +_See code: [src/commands/new/index.ts](https://github.com/asyncapi/cli/blob/v0.51.0/src/commands/new/index.ts)_ ## `asyncapi new file` @@ -520,7 +520,7 @@ EXAMPLES $ asyncapi optimize ./asyncapi.yaml --optimization=remove-components,reuse-components,move-to-components --output=terminal --no-tty ``` -_See code: [src/commands/optimize.ts](https://github.com/asyncapi/cli/blob/v0.50.2/src/commands/optimize.ts)_ +_See code: [src/commands/optimize.ts](https://github.com/asyncapi/cli/blob/v0.51.0/src/commands/optimize.ts)_ ## `asyncapi start` @@ -534,7 +534,7 @@ DESCRIPTION Start asyncapi studio ``` -_See code: [src/commands/start/index.ts](https://github.com/asyncapi/cli/blob/v0.50.2/src/commands/start/index.ts)_ +_See code: [src/commands/start/index.ts](https://github.com/asyncapi/cli/blob/v0.51.0/src/commands/start/index.ts)_ ## `asyncapi start studio` @@ -578,5 +578,5 @@ DESCRIPTION validate asyncapi file ``` -_See code: [src/commands/validate.ts](https://github.com/asyncapi/cli/blob/v0.50.2/src/commands/validate.ts)_ +_See code: [src/commands/validate.ts](https://github.com/asyncapi/cli/blob/v0.51.0/src/commands/validate.ts)_ From fce6c13d9f62c3f6d3d3bc9bcbe5b0585a62ea2e Mon Sep 17 00:00:00 2001 From: asyncapi-bot Date: Mon, 24 Jul 2023 14:03:21 +0200 Subject: [PATCH 04/23] docs(cli): update latest cli documentation (#1984) --- pages/docs/tools/cli/usage.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pages/docs/tools/cli/usage.md b/pages/docs/tools/cli/usage.md index 73a630e7337..8f04f8fce18 100644 --- a/pages/docs/tools/cli/usage.md +++ b/pages/docs/tools/cli/usage.md @@ -29,7 +29,7 @@ $ npm install -g @asyncapi/cli $ asyncapi COMMAND running command... $ asyncapi (--version) -@asyncapi/cli/0.51.0 linux-x64 node-v18.16.1 +@asyncapi/cli/0.51.1 linux-x64 node-v18.16.1 $ asyncapi --help [COMMAND] USAGE $ asyncapi COMMAND @@ -91,7 +91,7 @@ EXAMPLES $ asyncapi bundle ./asyncapi.yaml ./features.yaml --base ./asyncapi.yaml --reference-into-components ``` -_See code: [src/commands/bundle.ts](https://github.com/asyncapi/cli/blob/v0.51.0/src/commands/bundle.ts)_ +_See code: [src/commands/bundle.ts](https://github.com/asyncapi/cli/blob/v0.51.1/src/commands/bundle.ts)_ ## `asyncapi config` @@ -105,7 +105,7 @@ DESCRIPTION CLI config settings ``` -_See code: [src/commands/config/index.ts](https://github.com/asyncapi/cli/blob/v0.51.0/src/commands/config/index.ts)_ +_See code: [src/commands/config/index.ts](https://github.com/asyncapi/cli/blob/v0.51.1/src/commands/config/index.ts)_ ## `asyncapi config context` @@ -234,7 +234,7 @@ DESCRIPTION Convert asyncapi documents older to newer versions ``` -_See code: [src/commands/convert.ts](https://github.com/asyncapi/cli/blob/v0.51.0/src/commands/convert.ts)_ +_See code: [src/commands/convert.ts](https://github.com/asyncapi/cli/blob/v0.51.1/src/commands/convert.ts)_ ## `asyncapi diff OLD NEW` @@ -289,7 +289,7 @@ DESCRIPTION Find diff between two asyncapi files ``` -_See code: [src/commands/diff.ts](https://github.com/asyncapi/cli/blob/v0.51.0/src/commands/diff.ts)_ +_See code: [src/commands/diff.ts](https://github.com/asyncapi/cli/blob/v0.51.1/src/commands/diff.ts)_ ## `asyncapi generate` @@ -303,7 +303,7 @@ DESCRIPTION Generate typed models or other things like clients, applications or docs using AsyncAPI Generator templates. ``` -_See code: [src/commands/generate/index.ts](https://github.com/asyncapi/cli/blob/v0.51.0/src/commands/generate/index.ts)_ +_See code: [src/commands/generate/index.ts](https://github.com/asyncapi/cli/blob/v0.51.1/src/commands/generate/index.ts)_ ## `asyncapi generate fromTemplate ASYNCAPI TEMPLATE` @@ -432,7 +432,7 @@ DESCRIPTION Creates a new asyncapi file ``` -_See code: [src/commands/new/index.ts](https://github.com/asyncapi/cli/blob/v0.51.0/src/commands/new/index.ts)_ +_See code: [src/commands/new/index.ts](https://github.com/asyncapi/cli/blob/v0.51.1/src/commands/new/index.ts)_ ## `asyncapi new file` @@ -520,7 +520,7 @@ EXAMPLES $ asyncapi optimize ./asyncapi.yaml --optimization=remove-components,reuse-components,move-to-components --output=terminal --no-tty ``` -_See code: [src/commands/optimize.ts](https://github.com/asyncapi/cli/blob/v0.51.0/src/commands/optimize.ts)_ +_See code: [src/commands/optimize.ts](https://github.com/asyncapi/cli/blob/v0.51.1/src/commands/optimize.ts)_ ## `asyncapi start` @@ -534,7 +534,7 @@ DESCRIPTION Start asyncapi studio ``` -_See code: [src/commands/start/index.ts](https://github.com/asyncapi/cli/blob/v0.51.0/src/commands/start/index.ts)_ +_See code: [src/commands/start/index.ts](https://github.com/asyncapi/cli/blob/v0.51.1/src/commands/start/index.ts)_ ## `asyncapi start studio` @@ -578,5 +578,5 @@ DESCRIPTION validate asyncapi file ``` -_See code: [src/commands/validate.ts](https://github.com/asyncapi/cli/blob/v0.51.0/src/commands/validate.ts)_ +_See code: [src/commands/validate.ts](https://github.com/asyncapi/cli/blob/v0.51.1/src/commands/validate.ts)_ From ae9048e63adb54244b62ecd431fd8a040d349e83 Mon Sep 17 00:00:00 2001 From: Akshat Nema <76521428+akshatnema@users.noreply.github.com> Date: Mon, 24 Jul 2023 20:03:15 +0530 Subject: [PATCH 05/23] fix: updated tools workflow (#1627) --- config/all-tags.json | 2 +- config/tools-automated.json | 237 ++++++++++++++++++++------ config/tools.json | 2 +- scripts/build-tools.js | 13 +- scripts/tools/extract-tools-github.js | 2 + scripts/tools/tags-color.js | 5 + scripts/tools/tools-object.js | 2 +- 7 files changed, 197 insertions(+), 66 deletions(-) diff --git a/config/all-tags.json b/config/all-tags.json index fcc2f8108b9..0cbbd835368 100644 --- a/config/all-tags.json +++ b/config/all-tags.json @@ -1 +1 @@ -{"languages":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"},{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"},{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"},{"name":"HTML","color":"bg-[#E2A291]","borderColor":"border-[#E44D26]"},{"name":"C/C++","color":"bg-[#93CDEF]","borderColor":"border-[#0080CC]"},{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"},{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"},{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"},{"name":"Kotlin","color":"bg-[#B1ACDF]","borderColor":"border-[#756BD9]"},{"name":"Scala","color":"bg-[#FFA299]","borderColor":"border-[#DF301F]"},{"name":"Markdown","color":"bg-[#BABEBF]","borderColor":"border-[#445B64]"},{"name":"YAML","color":"bg-[#FFB764]","borderColor":"border-[#F1901F]"},{"name":"R","color":"bg-[#84B5ED]","borderColor":"border-[#246BBE]"},{"name":"Ruby","color":"bg-[#FF8289]","borderColor":"border-[#FF000F]"},{"name":"Rust","color":"bg-[#FFB8AA]","borderColor":"border-[#E43716]"},{"name":"Shell","color":"bg-[#87D4FF]","borderColor":"border-[#389ED7]"},{"name":"Groovy","color":"bg-[#B6D5E5]","borderColor":"border-[#609DBC]"}],"technologies":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Hermes","color":"bg-[#8AEEBD]","borderColor":"border-[#2AB672]"},{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"},{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"},{"name":"AWS","color":"bg-[#FF9F59]","borderColor":"border-[#EF6703]"},{"name":"Docker","color":"bg-[#B8E0FF]","borderColor":"border-[#2596ED]"},{"name":"Node-RED","color":"bg-[#FF7474]","borderColor":"border-[#8F0101]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Saas","color":"bg-[#6AB8EC]","borderColor":"border-[#2275AD]"},{"name":"Kubernetes-native","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Scala","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Azure","color":"bg-[#4B93FF]","borderColor":"border-[#015ADF]"},{"name":"Jenkins","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Socket.IO","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Kotlin","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Groovy","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Markdown","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Shell","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"WebComponents","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Babel","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Storybook","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"AsyncAPI Generator","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JetBrains","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"IntelliJ IDEA","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"VSCode","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"SmartPaste","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}]} \ No newline at end of file +{"languages":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"},{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"},{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"},{"name":"HTML","color":"bg-[#E2A291]","borderColor":"border-[#E44D26]"},{"name":"C/C++","color":"bg-[#93CDEF]","borderColor":"border-[#0080CC]"},{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"},{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"},{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"},{"name":"Kotlin","color":"bg-[#B1ACDF]","borderColor":"border-[#756BD9]"},{"name":"Scala","color":"bg-[#FFA299]","borderColor":"border-[#DF301F]"},{"name":"Markdown","color":"bg-[#BABEBF]","borderColor":"border-[#445B64]"},{"name":"YAML","color":"bg-[#FFB764]","borderColor":"border-[#F1901F]"},{"name":"R","color":"bg-[#84B5ED]","borderColor":"border-[#246BBE]"},{"name":"Ruby","color":"bg-[#FF8289]","borderColor":"border-[#FF000F]"},{"name":"Rust","color":"bg-[#FFB8AA]","borderColor":"border-[#E43716]"},{"name":"Shell","color":"bg-[#87D4FF]","borderColor":"border-[#389ED7]"},{"name":"Groovy","color":"bg-[#B6D5E5]","borderColor":"border-[#609DBC]"}],"technologies":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Hermes","color":"bg-[#8AEEBD]","borderColor":"border-[#2AB672]"},{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"},{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"},{"name":"AWS","color":"bg-[#FF9F59]","borderColor":"border-[#EF6703]"},{"name":"Docker","color":"bg-[#B8E0FF]","borderColor":"border-[#2596ED]"},{"name":"Node-RED","color":"bg-[#FF7474]","borderColor":"border-[#8F0101]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Saas","color":"bg-[#6AB8EC]","borderColor":"border-[#2275AD]"},{"name":"Kubernetes-native","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Scala","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Azure","color":"bg-[#4B93FF]","borderColor":"border-[#015ADF]"},{"name":"Jenkins","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Nest Js","color":"bg-[#E1224E]","borderColor":"border-[#B9012b]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Socket.IO","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Kotlin","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Groovy","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Markdown","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Shell","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"WebComponents","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Babel","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Storybook","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"AsyncAPI Generator","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"VSCode","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"SmartPaste","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JetBrains","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"IntelliJ IDEA","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}]} \ No newline at end of file diff --git a/config/tools-automated.json b/config/tools-automated.json index 1a91ef8f5fa..a02f8c8bcd7 100644 --- a/config/tools-automated.json +++ b/config/tools-automated.json @@ -2,6 +2,26 @@ "APIs": { "description": "The following is a list of APIs that expose functionality related to AsyncAPI.", "toolsList": [ + { + "title": "AsyncAPI Server API", + "description": "Server API providing official AsyncAPI tools", + "links": { + "websiteUrl": "https://api.asyncapi.com/v1", + "docsUrl": "https://api.asyncapi.com/v1/docs", + "repoUrl": "https://github.com/asyncapi/server-api" + }, + "filters": { + "technology": [ + "Node.js", + "TypeScript" + ], + "categories": [ + "api" + ], + "hasCommercial": false, + "isAsyncAPIOwner": true + } + }, { "title": "SIO-AsyncAPI", "description": "This is code-first approach to generate AsyncAPI specification from Socket.IO server.", @@ -30,22 +50,22 @@ "description": "The following is a list of tools that generate AsyncAPI documents from your code.", "toolsList": [ { - "title": "SIO-AsyncAPI", - "description": "This is code-first approach to generate AsyncAPI specification from Socket.IO server.", + "title": "AsyncAPI.Net", + "description": "The AsyncAPI.NET SDK contains a useful object model for AsyncAPI documents in .NET along with common serializers to extract raw OpenAPI JSON and YAML documents from the model.", "links": { - "websiteUrl": "https://github.com/daler-rahimov/sio-asyncapi", - "docsUrl": "https://github.com/daler-rahimov/sio-asyncapi", - "repoUrl": "https://github.com/daler-rahimov/sio-asyncapi" + "websiteUrl": "https://github.com/LEGO/AsyncAPI.NET/", + "repoUrl": "https://github.com/LEGO/AsyncAPI.NET" }, "filters": { - "language": "Python", + "language": "C#", "technology": [ - "Socket.IO", - "Flask" + ".NET", + "ASP.NET" ], "categories": [ + "converters", "code-first", - "api" + "validator" ], "hasCommercial": false, "isAsyncAPIOwner": false @@ -69,27 +89,34 @@ "hasCommercial": false, "isAsyncAPIOwner": false } - } - ] - }, - "Code Generators": { - "description": "The following is a list of tools that generate code from an AsyncAPI document; not the other way around.", - "toolsList": [ + }, { - "title": "Golang AsyncAPI Code Generator", - "description": "Generate Go client and server boilerplate from AsyncAPI specifications. Can be called from `go generate` without requirements.\n", + "title": "SIO-AsyncAPI", + "description": "This is code-first approach to generate AsyncAPI specification from Socket.IO server.", "links": { - "repoUrl": "https://github.com/lerenn/asyncapi-codegen" + "websiteUrl": "https://github.com/daler-rahimov/sio-asyncapi", + "docsUrl": "https://github.com/daler-rahimov/sio-asyncapi", + "repoUrl": "https://github.com/daler-rahimov/sio-asyncapi" }, "filters": { - "language": "golang", + "language": "Python", + "technology": [ + "Socket.IO", + "Flask" + ], "categories": [ - "code-generator" + "code-first", + "api" ], "hasCommercial": false, "isAsyncAPIOwner": false } - }, + } + ] + }, + "Code Generators": { + "description": "The following is a list of tools that generate code from an AsyncAPI document; not the other way around.", + "toolsList": [ { "title": "ZenWave SDK", "description": "DDD and API-First for Event-Driven Microservices", @@ -115,12 +142,50 @@ "hasCommercial": false, "isAsyncAPIOwner": false } + }, + { + "title": "Golang AsyncAPI Code Generator", + "description": "Generate Go client and server boilerplate from AsyncAPI specifications. Can be called from `go generate` without requirements.\n", + "links": { + "repoUrl": "https://github.com/lerenn/asyncapi-codegen" + }, + "filters": { + "language": "golang", + "categories": [ + "code-generator" + ], + "hasCommercial": false, + "isAsyncAPIOwner": false + } } ] }, "Converters": { "description": "The following is a list of tools that do not yet belong to any specific category but are also useful for the community.", - "toolsList": [] + "toolsList": [ + { + "title": "AsyncAPI.Net", + "description": "The AsyncAPI.NET SDK contains a useful object model for AsyncAPI documents in .NET along with common serializers to extract raw OpenAPI JSON and YAML documents from the model.", + "links": { + "websiteUrl": "https://github.com/LEGO/AsyncAPI.NET/", + "repoUrl": "https://github.com/LEGO/AsyncAPI.NET" + }, + "filters": { + "language": "C#", + "technology": [ + ".NET", + "ASP.NET" + ], + "categories": [ + "converters", + "code-first", + "validator" + ], + "hasCommercial": false, + "isAsyncAPIOwner": false + } + } + ] }, "Directories": { "description": "The following is a list of directories that index public AsyncAPI documents.", @@ -132,7 +197,27 @@ }, "Editors": { "description": "The following is a list of editors or related tools that allow editing of AsyncAPI document.", - "toolsList": [] + "toolsList": [ + { + "title": "AsyncAPI Studio", + "description": "Visually design your AsyncAPI files and event-driven architecture.", + "links": { + "websiteUrl": "https://studio.asyncapi.com", + "repoUrl": "https://github.com/asyncapi/studio" + }, + "filters": { + "technology": [ + "React JS", + "TypeScript" + ], + "categories": [ + "editor" + ], + "hasCommercial": false, + "isAsyncAPIOwner": true + } + } + ] }, "UI components": { "description": "The following is a list of UI components to view AsyncAPI documents.", @@ -196,6 +281,23 @@ "GitHub Actions": { "description": "The following is a list of GitHub Actions that you can use in your workflows", "toolsList": [ + { + "title": "GitHub Action for Generator", + "description": "GitHub Action to generate all the things from your AsyncAPI document using the AsyncAPI generator", + "links": { + "repoUrl": "https://github.com/asyncapi/github-action-for-generator" + }, + "filters": { + "technology": [ + "AsyncAPI Generator" + ], + "categories": [ + "github-action" + ], + "hasCommercial": false, + "isAsyncAPIOwner": true + } + }, { "title": "GitHub Action for Generator", "description": null, @@ -248,7 +350,30 @@ }, "Validators": { "description": "The following is a list of tools that validate AsyncAPI documents.", - "toolsList": [] + "toolsList": [ + { + "title": "AsyncAPI.Net", + "description": "The AsyncAPI.NET SDK contains a useful object model for AsyncAPI documents in .NET along with common serializers to extract raw OpenAPI JSON and YAML documents from the model.", + "links": { + "websiteUrl": "https://github.com/LEGO/AsyncAPI.NET/", + "repoUrl": "https://github.com/LEGO/AsyncAPI.NET" + }, + "filters": { + "language": "C#", + "technology": [ + ".NET", + "ASP.NET" + ], + "categories": [ + "converters", + "code-first", + "validator" + ], + "hasCommercial": false, + "isAsyncAPIOwner": false + } + } + ] }, "Compare tools": { "description": "The following is a list of tools that compare AsyncAPI documents.", @@ -276,6 +401,25 @@ "CLIs": { "description": "The following is a list of tools that you can work with in terminal or do some CI/CD automation.", "toolsList": [ + { + "title": "AsyncAPI CLI", + "description": "One CLI to rule them all. \nThis is a CLI that aims to integrate all AsyncAPI tools that you need while AsyncAPI document development and maintainance. \nYou can use it to generate docs or code, validate AsyncAPI document and event create new documents.\n", + "links": { + "websiteUrl": "https://www.asyncapi.com/tools/cli", + "repoUrl": "https://github.com/asyncapi/cli" + }, + "filters": { + "technology": [ + "TypeScript" + ], + "categories": [ + "others", + "cli" + ], + "hasCommercial": false, + "isAsyncAPIOwner": true + } + }, { "title": "ZenWave SDK", "description": "DDD and API-First for Event-Driven Microservices", @@ -301,25 +445,6 @@ "hasCommercial": false, "isAsyncAPIOwner": false } - }, - { - "title": "AsyncAPI CLI", - "description": "One CLI to rule them all. \nThis is a CLI that aims to integrate all AsyncAPI tools that you need while AsyncAPI document development and maintainance. \nYou can use it to generate docs or code, validate AsyncAPI document and event create new documents.\n", - "links": { - "websiteUrl": "https://www.asyncapi.com/tools/cli", - "repoUrl": "https://github.com/asyncapi/cli" - }, - "filters": { - "technology": [ - "TypeScript" - ], - "categories": [ - "others", - "cli" - ], - "hasCommercial": false, - "isAsyncAPIOwner": true - } } ] }, @@ -350,18 +475,15 @@ "description": "The following is a list of extensions for different IDEs like VSCode, IntelliJ IDEA and others", "toolsList": [ { - "title": "jAsyncAPI - IDEA plugin", - "description": "Idea plugin for the java-asyncapi - Helps to edit and validate AsyncAPI schemas.", + "title": "asyncapi-preview", + "description": "VSCode extension that enables you to:\n - Preview documentation generated using you AsyncAPI document. It uses AsyncAPI React component under the hood,\n - Create AsyncAPI documents faster using SmartPaste functionality\n", "links": { - "websiteUrl": "https://plugins.jetbrains.com/plugin/15673-asyncapi", - "docsUrl": "https://github.com/asyncapi/jasyncapi-idea-plugin#usage", - "repoUrl": "https://github.com/asyncapi/jasyncapi-idea-plugin" + "repoUrl": "https://github.com/asyncapi/vs-asyncapi-preview" }, "filters": { - "language": "Kotlin", "technology": [ - "JetBrains", - "IntelliJ IDEA" + "VSCode", + "SmartPaste" ], "categories": [ "ide-extension" @@ -371,15 +493,18 @@ } }, { - "title": "asyncapi-preview", - "description": "VSCode extension that enables you to:\n - Preview documentation generated using you AsyncAPI document. It uses AsyncAPI React component under the hood,\n - Create AsyncAPI documents faster using SmartPaste functionality\n", + "title": "jAsyncAPI - IDEA plugin", + "description": "Idea plugin for the java-asyncapi - Helps to edit and validate AsyncAPI schemas.", "links": { - "repoUrl": "https://github.com/asyncapi/vs-asyncapi-preview" + "websiteUrl": "https://plugins.jetbrains.com/plugin/15673-asyncapi", + "docsUrl": "https://github.com/asyncapi/jasyncapi-idea-plugin#usage", + "repoUrl": "https://github.com/asyncapi/jasyncapi-idea-plugin" }, "filters": { + "language": "Kotlin", "technology": [ - "VSCode", - "SmartPaste" + "JetBrains", + "IntelliJ IDEA" ], "categories": [ "ide-extension" diff --git a/config/tools.json b/config/tools.json index faef2b3ec84..30ec05cb0d9 100644 --- a/config/tools.json +++ b/config/tools.json @@ -1 +1 @@ -{"APIs":{"description":"The following is a list of APIs that expose functionality related to AsyncAPI.","toolsList":[{"title":"API Tracker - AsyncAPI specs","description":"Explore APIs and companies with public AsyncAPI specifications.","links":{"websiteUrl":"https://apitracker.io/specifications/asyncapi","repoUrl":""},"filters":{"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI-Directory by APIs.guru","description":"Directory of asynchronous API specifications in AsyncAPI format.","links":{"websiteUrl":"https://apis.guru/asyncapi-directory/","repoUrl":"https://github.com/APIs-guru/asyncapi-directory"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"SIO-AsyncAPI","description":"This is code-first approach to generate AsyncAPI specification from Socket.IO server.","links":{"websiteUrl":"https://github.com/daler-rahimov/sio-asyncapi","docsUrl":"https://github.com/daler-rahimov/sio-asyncapi","repoUrl":"https://github.com/daler-rahimov/sio-asyncapi"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"technology":[{"name":"Socket.IO","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["code-first","api"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Code-first tools":{"description":"The following is a list of tools that generate AsyncAPI documents from your code.","toolsList":[{"title":"EventBridge Atlas","description":"Tool that translates your AWS EventBridge Schemas into an AsyncAPI document and a web UI.","links":{"websiteUrl":"https://eventbridge-atlas.netlify.app/","repoUrl":"https://github.com/boyney123/eventbridge-atlas"},"filters":{"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Go AsyncAPI","description":"This library helps to create AsyncAPI spec from your Go message structures. It uses reflection to translate Go structures in JSON Schema definitions and arrange them in AsyncAPI schema.","links":{"repoUrl":"https://github.com/swaggest/go-asyncapi"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"Java AsyncAPI","description":"This tool stores modules, which simplifies interacting with AsyncAPI in jvm ecosystem.","links":{"repoUrl":"https://github.com/asyncapi/jasyncapi"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Kotlin","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"KnstEventBus","description":"AsyncApi code-first tools for c#. Generates document and view.","links":{"repoUrl":"https://github.com/d0972058277/KnstEventBus"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"},{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Kotlin AsyncAPI","description":"The Kotlin AsyncAPI project aims to provide convenience tools for generating and serving AsyncAPI documentation. The core of this project is a Kotlin DSL for building the specification in a typesafe way.","links":{"repoUrl":"https://github.com/OpenFolder/kotlin-asyncapi"},"filters":{"language":[{"name":"Kotlin","color":"bg-[#B1ACDF]","borderColor":"border-[#756BD9]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"nestjs-asyncapi","description":"Utilize decorators to generate AsyncAPI document utilizing DTOs (similar to @nestjs/swagger) and a web UI.","links":{"repoUrl":"https://github.com/flamewow/nestjs-asyncapi"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Kubernetes-native","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Neuroglia AsyncAPI","description":"A .NET SDK for the Async API specification. Automatically generates and serves AsyncAPI documents based on your code. Includes fluent-builders to create AsyncAPI documents from scratch, and provides a web-based GUI to browse generated documents.","links":{"repoUrl":"https://github.com/neuroglia-io/AsyncApi"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Saunter","description":"Saunter is an AsyncAPI documentation generator for dotnet. Generates (and hosts) an AsyncAPI schema document from your code.","links":{"repoUrl":"https://github.com/tehmantra/saunter"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"SIO-AsyncAPI","description":"This is code-first approach to generate AsyncAPI specification from Socket.IO server.","links":{"websiteUrl":"https://github.com/daler-rahimov/sio-asyncapi","docsUrl":"https://github.com/daler-rahimov/sio-asyncapi","repoUrl":"https://github.com/daler-rahimov/sio-asyncapi"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"technology":[{"name":"Socket.IO","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["code-first","api"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Springwolf","description":"Automated documentation for async APIs built with Spring Boot. Like Springfox for AsyncAPI. Auto-generates an AsyncAPI document and a web UI.","links":{"websiteUrl":"https://springwolf.github.io/","repoUrl":"https://github.com/springwolf/springwolf-core"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"sttp tapir","description":"Library for describing HTTP endpoints, and then interpreting them as a server, client, or documentation","links":{"websiteUrl":"https://tapir.softwaremill.com/","repoUrl":"https://github.com/softwaremill/tapir"},"filters":{"language":[{"name":"Scala","color":"bg-[#FFA299]","borderColor":"border-[#DF301F]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}}]},"Code Generators":{"description":"The following is a list of tools that generate code from an AsyncAPI document; not the other way around.","toolsList":[{"title":"AsyncAPI Generator","description":"Generator is a tool that you can use to generate whatever you want basing on the AsyncAPI specification file as an input.","links":{"docsUrl":"https://www.asyncapi.com/docs/tools/generator","repoUrl":"https://github.com/asyncapi/generator"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["code-generator","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Golang AsyncAPI Code Generator","description":"Generate Go client and server boilerplate from AsyncAPI specifications. Can be called from `go generate` without requirements.\n","links":{"repoUrl":"https://github.com/lerenn/asyncapi-codegen"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"MultiAPI Generator","description":"This is a plugin designed to help developers automatizing the creation of code classes from YML files based on AsyncApi and OpenAPI. It is presented in 2 flavours Maven and Gradle","links":{"repoUrl":"https://github.com/sngular/scs-multiapi-plugin"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Groovy","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Node-RED AsyncAPI plugin","description":"A plugin for generating and configuring nodes for Kafka, MQTT, AMQP, etc. automatically from an AsyncAPI specification.","links":{"repoUrl":"https://github.com/dalelane/node-red-contrib-plugin-asyncapi"},"filters":{"technology":[{"name":"Node-RED","color":"bg-[#FF7474]","borderColor":"border-[#8F0101]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Converters":{"description":"The following is a list of tools that do not yet belong to any specific category but are also useful for the community.","toolsList":[{"title":"AsyncAPI-format","description":"Format an AsyncAPI document by ordering, casing, formatting, and filtering fields.","links":{"repoUrl":"https://github.com/thim81/asyncapi-format"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["converter","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Converter","description":"Converts old versions of AsyncAPI files into the latest version.","links":{"repoUrl":"https://github.com/asyncapi/converter-js"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["converter"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Converter-Go","description":"The AsyncAPI Converter converts AsyncAPI documents from versions 1.0.0, 1.1.0 and 1.2.0 to version 2.0.0. It supports both json and yaml formats on input and output. By default, the AsyncAPI Converter converts a document into the json format.","links":{"repoUrl":"https://github.com/asyncapi/converter-go"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["converter"],"hasCommercial":false,"isAsyncAPIOwner":true,"technology":[]}}]},"Directories":{"description":"The following is a list of directories that index public AsyncAPI documents.","toolsList":[{"title":"API Tracker - AsyncAPI specs","description":"Explore APIs and companies with public AsyncAPI specifications.","links":{"websiteUrl":"https://apitracker.io/specifications/asyncapi","repoUrl":""},"filters":{"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI-Directory by APIs.guru","description":"Directory of asynchronous API specifications in AsyncAPI format.","links":{"websiteUrl":"https://apis.guru/asyncapi-directory/","repoUrl":"https://github.com/APIs-guru/asyncapi-directory"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Documentation Generators":{"description":"The following is a list of tools that generate human-readable documentation from an AsyncAPI document.","toolsList":[{"title":"AsyncAPI Generator","description":"Generator is a tool that you can use to generate whatever you want basing on the AsyncAPI specification file as an input.","links":{"docsUrl":"https://www.asyncapi.com/docs/tools/generator","repoUrl":"https://github.com/asyncapi/generator"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Markdown","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"asyncapi-asciidoc-template","description":"Asciidoc template for the asyncapi generator","links":{"repoUrl":"https://gitlab.com/djencks/asyncapi-asciidoc-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"}],"categories":["documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Bump.sh","description":"OpenAPI 2 & 3 / AsyncAPI 2 documentation generator, with automatic changelog and visual diff.","links":{"websiteUrl":"https://bump.sh/","repoUrl":""},"filters":{"categories":["documentation-generator"],"hasCommercial":true,"isAsyncAPIOwner":false,"technology":[]}},{"title":"Cupid","description":"A library that focuses on finding and analyzing the relationships between AsyncAPI documents. It outputs a map of the system architecture.","links":{"repoUrl":"https://github.com/asyncapi/cupid"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"KnstEventBus","description":"AsyncApi code-first tools for c#. Generates document and view.","links":{"repoUrl":"https://github.com/d0972058277/KnstEventBus"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"},{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Springwolf","description":"Automated documentation for async APIs built with Spring Boot. Like Springfox for AsyncAPI. Auto-generates an AsyncAPI document and a web UI.","links":{"websiteUrl":"https://springwolf.github.io/","repoUrl":"https://github.com/springwolf/springwolf-core"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Widdershins","description":"OpenAPI 3.0 / Swagger 2.0 / AsyncAPI 1.0 definition to Slate / Shins compatible markdown.","links":{"websiteUrl":"https://mermade.github.io/reslate/","repoUrl":"https://github.com/Mermade/widdershins"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Shell","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Editors":{"description":"The following is a list of editors or related tools that allow editing of AsyncAPI document.","toolsList":[]},"UI components":{"description":"The following is a list of UI components to view AsyncAPI documents.","toolsList":[{"title":"Api-Diff-Viewer","description":"React component to view the difference between two Json based API documents. Supported specifications: JsonSchema, OpenAPI 3.x, AsyncAPI 2.x.","links":{"repoUrl":"https://github.com/udamir/api-diff-viewer","websiteUrl":"https://api-diff-viewer.vercel.app/"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":"Babel","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Storybook","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ui-component"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI React component","description":"React component for rendering documentation from your specification in real-time in the browser. It also provides a WebComponent and bundle for Angular and Vue","links":{"repoUrl":"https://github.com/asyncapi/asyncapi-react"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":"WebComponents","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ui-component"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"DSL":{"description":"Writing YAML by hand is no fun, and maybe you don't want a GUI, so use a Domain Specific Language to write AsyncAPI in your language of choice.","toolsList":[{"title":"BOATS","description":"Compile your single AsyncAPI file from multiple YAML files with BOATS and with the help of the template engine Nunjucks, plus a many extra helpers to automate much of the donkey work.","links":{"repoUrl":"https://github.com/j-d-carmichael/boats"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["dsl"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Frameworks":{"description":"The following is a list of API/application frameworks that make use of AsyncAPI.","toolsList":[{"title":"Asynction","description":"SocketIO server framework driven by the AsyncAPI specification. Asynction guarantees that your API will work in accordance with its AsyncAPI documentation. Built on top of Flask-SocketIO.","links":{"websiteUrl":"https://pypi.org/project/asynction/","repoUrl":"https://github.com/dedoussis/asynction"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"technology":[{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["framework"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"GitHub Actions":{"description":"The following is a list of GitHub Actions that you can use in your workflows","toolsList":[{"title":"API documentation generation on Bump.sh","description":"With this GitHub Action you can automatically generate your API reference (with the changelog and diff) on Bump.sh from any AsyncAPI file.","links":{"websiteUrl":"https://github.com/marketplace/actions/api-documentation-on-bump","repoUrl":"https://github.com/bump-sh/github-action"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI GitHub Action","description":"This action validates if the AsyncAPI schema file is valid or not.","links":{"websiteUrl":"https://github.com/marketplace/actions/asyncapi-github-action","repoUrl":"https://github.com/WaleedAshraf/asyncapi-github-action"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["github-action","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Automated version bump for AsyncAPI documents","description":"With this GitHub Action, you can automatically bump the version based on commit messages, which is similar to what semantic-release is for NPM.","links":{"websiteUrl":"https://github.com/marketplace/actions/automated-version-bump-for-asyncapi","repoUrl":"https://github.com/bump-sh/github-action"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"GitHub Action for Generator","description":null,"links":{"repoUrl":"https://github.com/actions-marketplace-validations/asyncapi_github-action-for-generator"},"filters":{"technology":[{"name":"AsyncAPI Generator","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Mocking and Testing":{"description":"The tools below take specification documents as input, then publish fake messages to broker destinations for simulation purposes. They may also check that publisher messages are compliant with schemas.","toolsList":[{"title":"Microcks","description":"Mocking and testing platform for API and microservices. Turn your AsyncAPI, OpenAPI contract examples, or Postman collections into ready-to-use mocks. Use examples to simulate and validate received messages according to schema elements.","links":{"websiteUrl":"https://microcks.io/","repoUrl":"https://github.com/microcks/microcks"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Kubernetes-native","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Saas","color":"bg-[#6AB8EC]","borderColor":"border-[#2275AD]"}],"categories":["mocking-and-testing"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"MultiAPI Converter","description":"Use AsyncAPI definition, to generate Spring Cloud Contract producer validation or consumer stubs, using maven.","links":{"repoUrl":"https://github.com/sngular/scc-multiapi-converter"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"}],"categories":["mocking-and-testing"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Virtualan","description":"Mocking and testing platform for API and microservices. Allows you to create and setup mocks for OpenAPI and AsyncAPI contracts. Shows how to setup and create AsyncAPI GitHub Reference Examples and OpenAPI GitHub Reference Examples.","links":{"websiteUrl":"https://www.virtualan.io/index.html","repoUrl":"https://github.com/virtualansoftware"},"filters":{"technology":[{"name":"Kubernetes-native","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["mocking-and-testing"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Validators":{"description":"The following is a list of tools that validate AsyncAPI documents.","toolsList":[{"title":"AMF","description":"AMF (AML Modeling Framework) is an open-source library capable of parsing and validating AML metadata documents.","links":{"docsUrl":"https://a.ml/docs/","repoUrl":"https://github.com/aml-org/amf"},"filters":{"language":[{"name":"Scala","color":"bg-[#FFA299]","borderColor":"border-[#DF301F]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI GitHub Action","description":"This action validates if the AsyncAPI schema file is valid or not.","links":{"websiteUrl":"https://github.com/marketplace/actions/asyncapi-github-action","repoUrl":"https://github.com/WaleedAshraf/asyncapi-github-action"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["github-action","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI Parser","description":"Use this package to parse and validate AsyncAPI documents —either YAML or JSON— in your Node.js or browser application. Updated bundle for the browser is always attached to the GitHub Release.","links":{"repoUrl":"https://github.com/asyncapi/parser-js"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"AsyncAPI Parser","description":"The AsyncAPI Parser validates AsyncAPI documents according to dedicated schemas.","links":{"repoUrl":"https://github.com/asyncapi/parser-go"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":true,"technology":[]}},{"title":"AsyncAPI Parser Wrapper","description":"Use this library to parse and validate AsyncAPI documents — either YAML or JSON — in your Java application. It is a Java wrapper over JavaScript Parser implemented using J2V8.","links":{"repoUrl":"https://github.com/AsyncAPITools/parser-java-wrapper"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"asyncapi-validator","description":"It allows you to validate the schema of your messages against your AsyncAPI schema definition. You can use it with Kafka, RabbitMQ or any other messaging/queue.","links":{"repoUrl":"https://github.com/WaleedAshraf/asyncapi-validator"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Spectral","description":"A flexible JSON/YAML linter for creating automated style guides, with baked in support for OpenAPI v3.1, v3.0, and v2.0 as well as AsyncAPI v2.x.","links":{"repoUrl":"https://github.com/stoplightio/spectral"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Compare tools":{"description":"The following is a list of tools that compare AsyncAPI documents.","toolsList":[{"title":"Api-Smart-Diff","description":"It allows you to compare two API documents and classify changes. Supported API specifications: OpenAPI, AsyncAPI, JsonSchema.","links":{"repoUrl":"https://github.com/udamir/api-smart-diff"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"categories":["compare-tool"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI Diff","description":"Diff is a library that compares two AsyncAPI Documents and provides information about the differences by pointing out explicitly information like breaking changes.","links":{"repoUrl":"https://github.com/asyncapi/diff"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["compare-tool"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"jasyncapicmp","description":"Tool/library/maven-plugin for comparing two AsyncAPI versions and evaluating compatibility.","links":{"websiteUrl":"https://siom79.github.io/jasyncapicmp/","repoUrl":"https://github.com/siom79/jasyncapicmp"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["compare-tool"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"CLIs":{"description":"The following is a list of tools that you can work with in terminal or do some CI/CD automation.","toolsList":[{"title":"AsyncAPI CLI","description":"One CLI to rule them all. \nThis is a CLI that aims to integrate all AsyncAPI tools that you need while AsyncAPI document development and maintainance. \nYou can use it to generate docs or code, validate AsyncAPI document and event create new documents.\n","links":{"websiteUrl":"https://www.asyncapi.com/tools/cli","repoUrl":"https://github.com/asyncapi/cli"},"filters":{"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["others","cli"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"AsyncAPI-format","description":"Format an AsyncAPI document by ordering, casing, formatting, and filtering fields.","links":{"repoUrl":"https://github.com/asyncapi/converter-go"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["converter","cli"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Bundlers":{"description":"The following is a list of tools that you can work with to bundle AsyncAPI documents.","toolsList":[{"title":"Api-ref-bundler","description":"It allows you bundle/dereference external/internal $refs in Json based API document. Supported specifications: OpenAPI, AsyncAPI, JsonSchema.","links":{"repoUrl":"https://github.com/udamir/api-ref-bundler"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["bundler"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI Bundler","description":"Combine multiple AsyncAPI specification files into one.","links":{"repoUrl":"https://github.com/asyncapi/bundler"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["bundler"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"IDE Extensions":{"description":"The following is a list of extensions for different IDEs like VSCode, IntelliJ IDEA and others","toolsList":[{"title":"asyncapi-preview","description":"VSCode extension that enables you to:\n - Preview documentation generated using you AsyncAPI document. It uses AsyncAPI React component under the hood,\n - Create AsyncAPI documents faster using SmartPaste functionality\n","links":{"repoUrl":"https://github.com/asyncapi/vs-asyncapi-preview"},"filters":{"technology":[{"name":"VSCode","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"SmartPaste","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ide-extension"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"jAsyncAPI - IDEA plugin","description":"Idea plugin for the java-asyncapi - Helps to edit and validate AsyncAPI schemas.","links":{"websiteUrl":"https://plugins.jetbrains.com/plugin/15673-asyncapi","docsUrl":"https://github.com/asyncapi/jasyncapi-idea-plugin#usage","repoUrl":"https://github.com/asyncapi/jasyncapi-idea-plugin"},"filters":{"language":[{"name":"Kotlin","color":"bg-[#B1ACDF]","borderColor":"border-[#756BD9]"}],"technology":[{"name":"JetBrains","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"IntelliJ IDEA","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ide-extension"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"Others":{"description":"The following is a list of tools that comes under Other category.","toolsList":[{"title":"AsyncAPI CLI","description":"One CLI to rule them all. \nThis is a CLI that aims to integrate all AsyncAPI tools that you need while AsyncAPI document development and maintainance. \nYou can use it to generate docs or code, validate AsyncAPI document and event create new documents.\n","links":{"websiteUrl":"https://www.asyncapi.com/tools/cli","repoUrl":"https://github.com/asyncapi/cli"},"filters":{"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["others","cli"],"hasCommercial":false,"isAsyncAPIOwner":true}}]}} \ No newline at end of file +{"APIs":{"description":"The following is a list of APIs that expose functionality related to AsyncAPI.","toolsList":[{"title":"API Tracker - AsyncAPI specs","description":"Explore APIs and companies with public AsyncAPI specifications.","links":{"websiteUrl":"https://apitracker.io/specifications/asyncapi","repoUrl":""},"filters":{"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI Server API","description":"Server API providing official AsyncAPI tools","links":{"websiteUrl":"https://api.asyncapi.com/v1","docsUrl":"https://api.asyncapi.com/v1/docs","repoUrl":"https://github.com/asyncapi/server-api"},"filters":{"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["api"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"AsyncAPI-Directory by APIs.guru","description":"Directory of asynchronous API specifications in AsyncAPI format.","links":{"websiteUrl":"https://apis.guru/asyncapi-directory/","repoUrl":"https://github.com/APIs-guru/asyncapi-directory"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"SIO-AsyncAPI","description":"This is code-first approach to generate AsyncAPI specification from Socket.IO server.","links":{"websiteUrl":"https://github.com/daler-rahimov/sio-asyncapi","docsUrl":"https://github.com/daler-rahimov/sio-asyncapi","repoUrl":"https://github.com/daler-rahimov/sio-asyncapi"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"technology":[{"name":"Socket.IO","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["code-first","api"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Code-first tools":{"description":"The following is a list of tools that generate AsyncAPI documents from your code.","toolsList":[{"title":"AsyncAPI.Net","description":"The AsyncAPI.NET SDK contains a useful object model for AsyncAPI documents in .NET along with common serializers to extract raw OpenAPI JSON and YAML documents from the model.","links":{"websiteUrl":"https://github.com/LEGO/AsyncAPI.NET/","repoUrl":"https://github.com/LEGO/AsyncAPI.NET"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"}],"categories":["converters","code-first","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"EventBridge Atlas","description":"Tool that translates your AWS EventBridge Schemas into an AsyncAPI document and a web UI.","links":{"websiteUrl":"https://eventbridge-atlas.netlify.app/","repoUrl":"https://github.com/boyney123/eventbridge-atlas"},"filters":{"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Go AsyncAPI","description":"This library helps to create AsyncAPI spec from your Go message structures. It uses reflection to translate Go structures in JSON Schema definitions and arrange them in AsyncAPI schema.","links":{"repoUrl":"https://github.com/swaggest/go-asyncapi"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"Java AsyncAPI","description":"This tool stores modules, which simplifies interacting with AsyncAPI in jvm ecosystem.","links":{"repoUrl":"https://github.com/asyncapi/jasyncapi"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Kotlin","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"KnstEventBus","description":"AsyncApi code-first tools for c#. Generates document and view.","links":{"repoUrl":"https://github.com/d0972058277/KnstEventBus"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"},{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Kotlin AsyncAPI","description":"The Kotlin AsyncAPI project aims to provide convenience tools for generating and serving AsyncAPI documentation. The core of this project is a Kotlin DSL for building the specification in a typesafe way.","links":{"repoUrl":"https://github.com/OpenFolder/kotlin-asyncapi"},"filters":{"language":[{"name":"Kotlin","color":"bg-[#B1ACDF]","borderColor":"border-[#756BD9]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"nestjs-asyncapi","description":"Utilize decorators to generate AsyncAPI document utilizing DTOs (similar to @nestjs/swagger) and a web UI.","links":{"repoUrl":"https://github.com/flamewow/nestjs-asyncapi"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Nest Js","color":"bg-[#E1224E]","borderColor":"border-[#B9012b]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Neuroglia AsyncAPI","description":"A .NET SDK for the Async API specification. Automatically generates and serves AsyncAPI documents based on your code. Includes fluent-builders to create AsyncAPI documents from scratch, and provides a web-based GUI to browse generated documents.","links":{"repoUrl":"https://github.com/neuroglia-io/AsyncApi"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Saunter","description":"Saunter is an AsyncAPI documentation generator for dotnet. Generates (and hosts) an AsyncAPI schema document from your code.","links":{"repoUrl":"https://github.com/tehmantra/saunter"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"SIO-AsyncAPI","description":"This is code-first approach to generate AsyncAPI specification from Socket.IO server.","links":{"websiteUrl":"https://github.com/daler-rahimov/sio-asyncapi","docsUrl":"https://github.com/daler-rahimov/sio-asyncapi","repoUrl":"https://github.com/daler-rahimov/sio-asyncapi"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"technology":[{"name":"Socket.IO","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["code-first","api"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Springwolf","description":"Automated documentation for async APIs built with Spring Boot. Like Springfox for AsyncAPI. Auto-generates an AsyncAPI document and a web UI.","links":{"websiteUrl":"https://springwolf.github.io/","repoUrl":"https://github.com/springwolf/springwolf-core"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"sttp tapir","description":"Library for describing HTTP endpoints, and then interpreting them as a server, client, or documentation","links":{"websiteUrl":"https://tapir.softwaremill.com/","repoUrl":"https://github.com/softwaremill/tapir"},"filters":{"language":[{"name":"Scala","color":"bg-[#FFA299]","borderColor":"border-[#DF301F]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}}]},"Code Generators":{"description":"The following is a list of tools that generate code from an AsyncAPI document; not the other way around.","toolsList":[{"title":"AsyncAPI Generator","description":"Generator is a tool that you can use to generate whatever you want basing on the AsyncAPI specification file as an input.","links":{"docsUrl":"https://www.asyncapi.com/docs/tools/generator","repoUrl":"https://github.com/asyncapi/generator"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["code-generator","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Golang AsyncAPI Code Generator","description":"Generate Go client and server boilerplate from AsyncAPI specifications. Can be called from `go generate` without requirements.\n","links":{"repoUrl":"https://github.com/lerenn/asyncapi-codegen"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"MultiAPI Generator","description":"This is a plugin designed to help developers automatizing the creation of code classes from YML files based on AsyncApi and OpenAPI. It is presented in 2 flavours Maven and Gradle","links":{"repoUrl":"https://github.com/sngular/scs-multiapi-plugin"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Groovy","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Node-RED AsyncAPI plugin","description":"A plugin for generating and configuring nodes for Kafka, MQTT, AMQP, etc. automatically from an AsyncAPI specification.","links":{"repoUrl":"https://github.com/dalelane/node-red-contrib-plugin-asyncapi"},"filters":{"technology":[{"name":"Node-RED","color":"bg-[#FF7474]","borderColor":"border-[#8F0101]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Converters":{"description":"The following is a list of tools that do not yet belong to any specific category but are also useful for the community.","toolsList":[{"title":"AsyncAPI-format","description":"Format an AsyncAPI document by ordering, casing, formatting, and filtering fields.","links":{"repoUrl":"https://github.com/thim81/asyncapi-format"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["converter","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI.Net","description":"The AsyncAPI.NET SDK contains a useful object model for AsyncAPI documents in .NET along with common serializers to extract raw OpenAPI JSON and YAML documents from the model.","links":{"websiteUrl":"https://github.com/LEGO/AsyncAPI.NET/","repoUrl":"https://github.com/LEGO/AsyncAPI.NET"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"}],"categories":["converters","code-first","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Converter","description":"Converts old versions of AsyncAPI files into the latest version.","links":{"repoUrl":"https://github.com/asyncapi/converter-js"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["converter"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Converter-Go","description":"The AsyncAPI Converter converts AsyncAPI documents from versions 1.0.0, 1.1.0 and 1.2.0 to version 2.0.0. It supports both json and yaml formats on input and output. By default, the AsyncAPI Converter converts a document into the json format.","links":{"repoUrl":"https://github.com/asyncapi/converter-go"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["converter"],"hasCommercial":false,"isAsyncAPIOwner":true,"technology":[]}}]},"Directories":{"description":"The following is a list of directories that index public AsyncAPI documents.","toolsList":[{"title":"API Tracker - AsyncAPI specs","description":"Explore APIs and companies with public AsyncAPI specifications.","links":{"websiteUrl":"https://apitracker.io/specifications/asyncapi","repoUrl":""},"filters":{"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI-Directory by APIs.guru","description":"Directory of asynchronous API specifications in AsyncAPI format.","links":{"websiteUrl":"https://apis.guru/asyncapi-directory/","repoUrl":"https://github.com/APIs-guru/asyncapi-directory"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Documentation Generators":{"description":"The following is a list of tools that generate human-readable documentation from an AsyncAPI document.","toolsList":[{"title":"AsyncAPI Generator","description":"Generator is a tool that you can use to generate whatever you want basing on the AsyncAPI specification file as an input.","links":{"docsUrl":"https://www.asyncapi.com/docs/tools/generator","repoUrl":"https://github.com/asyncapi/generator"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Markdown","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"asyncapi-asciidoc-template","description":"Asciidoc template for the asyncapi generator","links":{"repoUrl":"https://gitlab.com/djencks/asyncapi-asciidoc-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"}],"categories":["documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Bump.sh","description":"OpenAPI 2 & 3 / AsyncAPI 2 documentation generator, with automatic changelog and visual diff.","links":{"websiteUrl":"https://bump.sh/","repoUrl":""},"filters":{"categories":["documentation-generator"],"hasCommercial":true,"isAsyncAPIOwner":false,"technology":[]}},{"title":"Cupid","description":"A library that focuses on finding and analyzing the relationships between AsyncAPI documents. It outputs a map of the system architecture.","links":{"repoUrl":"https://github.com/asyncapi/cupid"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"KnstEventBus","description":"AsyncApi code-first tools for c#. Generates document and view.","links":{"repoUrl":"https://github.com/d0972058277/KnstEventBus"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"},{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Springwolf","description":"Automated documentation for async APIs built with Spring Boot. Like Springfox for AsyncAPI. Auto-generates an AsyncAPI document and a web UI.","links":{"websiteUrl":"https://springwolf.github.io/","repoUrl":"https://github.com/springwolf/springwolf-core"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Widdershins","description":"OpenAPI 3.0 / Swagger 2.0 / AsyncAPI 1.0 definition to Slate / Shins compatible markdown.","links":{"websiteUrl":"https://mermade.github.io/reslate/","repoUrl":"https://github.com/Mermade/widdershins"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Shell","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Editors":{"description":"The following is a list of editors or related tools that allow editing of AsyncAPI document.","toolsList":[{"title":"AsyncAPI Studio","description":"Visually design your AsyncAPI files and event-driven architecture.","links":{"websiteUrl":"https://studio.asyncapi.com","repoUrl":"https://github.com/asyncapi/studio"},"filters":{"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["editor"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"UI components":{"description":"The following is a list of UI components to view AsyncAPI documents.","toolsList":[{"title":"Api-Diff-Viewer","description":"React component to view the difference between two Json based API documents. Supported specifications: JsonSchema, OpenAPI 3.x, AsyncAPI 2.x.","links":{"repoUrl":"https://github.com/udamir/api-diff-viewer","websiteUrl":"https://api-diff-viewer.vercel.app/"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":"Babel","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Storybook","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ui-component"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI React component","description":"React component for rendering documentation from your specification in real-time in the browser. It also provides a WebComponent and bundle for Angular and Vue","links":{"repoUrl":"https://github.com/asyncapi/asyncapi-react"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":"WebComponents","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ui-component"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"DSL":{"description":"Writing YAML by hand is no fun, and maybe you don't want a GUI, so use a Domain Specific Language to write AsyncAPI in your language of choice.","toolsList":[{"title":"BOATS","description":"Compile your single AsyncAPI file from multiple YAML files with BOATS and with the help of the template engine Nunjucks, plus a many extra helpers to automate much of the donkey work.","links":{"repoUrl":"https://github.com/j-d-carmichael/boats"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["dsl"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Frameworks":{"description":"The following is a list of API/application frameworks that make use of AsyncAPI.","toolsList":[{"title":"Asynction","description":"SocketIO server framework driven by the AsyncAPI specification. Asynction guarantees that your API will work in accordance with its AsyncAPI documentation. Built on top of Flask-SocketIO.","links":{"websiteUrl":"https://pypi.org/project/asynction/","repoUrl":"https://github.com/dedoussis/asynction"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"technology":[{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["framework"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"GitHub Actions":{"description":"The following is a list of GitHub Actions that you can use in your workflows","toolsList":[{"title":"API documentation generation on Bump.sh","description":"With this GitHub Action you can automatically generate your API reference (with the changelog and diff) on Bump.sh from any AsyncAPI file.","links":{"websiteUrl":"https://github.com/marketplace/actions/api-documentation-on-bump","repoUrl":"https://github.com/bump-sh/github-action"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI GitHub Action","description":"This action validates if the AsyncAPI schema file is valid or not.","links":{"websiteUrl":"https://github.com/marketplace/actions/asyncapi-github-action","repoUrl":"https://github.com/WaleedAshraf/asyncapi-github-action"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["github-action","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Automated version bump for AsyncAPI documents","description":"With this GitHub Action, you can automatically bump the version based on commit messages, which is similar to what semantic-release is for NPM.","links":{"websiteUrl":"https://github.com/marketplace/actions/automated-version-bump-for-asyncapi","repoUrl":"https://github.com/bump-sh/github-action"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"GitHub Action for Generator","description":"GitHub Action to generate all the things from your AsyncAPI document using the AsyncAPI generator","links":{"repoUrl":"https://github.com/asyncapi/github-action-for-generator"},"filters":{"technology":[{"name":"AsyncAPI Generator","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"GitHub Action for Generator","description":null,"links":{"repoUrl":"https://github.com/actions-marketplace-validations/asyncapi_github-action-for-generator"},"filters":{"technology":[{"name":"AsyncAPI Generator","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Mocking and Testing":{"description":"The tools below take specification documents as input, then publish fake messages to broker destinations for simulation purposes. They may also check that publisher messages are compliant with schemas.","toolsList":[{"title":"Microcks","description":"Mocking and testing platform for API and microservices. Turn your AsyncAPI, OpenAPI contract examples, or Postman collections into ready-to-use mocks. Use examples to simulate and validate received messages according to schema elements.","links":{"websiteUrl":"https://microcks.io/","repoUrl":"https://github.com/microcks/microcks"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Kubernetes-native","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Saas","color":"bg-[#6AB8EC]","borderColor":"border-[#2275AD]"}],"categories":["mocking-and-testing"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"MultiAPI Converter","description":"Use AsyncAPI definition, to generate Spring Cloud Contract producer validation or consumer stubs, using maven.","links":{"repoUrl":"https://github.com/sngular/scc-multiapi-converter"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"}],"categories":["mocking-and-testing"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Virtualan","description":"Mocking and testing platform for API and microservices. Allows you to create and setup mocks for OpenAPI and AsyncAPI contracts. Shows how to setup and create AsyncAPI GitHub Reference Examples and OpenAPI GitHub Reference Examples.","links":{"websiteUrl":"https://www.virtualan.io/index.html","repoUrl":"https://github.com/virtualansoftware"},"filters":{"technology":[{"name":"Kubernetes-native","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["mocking-and-testing"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Validators":{"description":"The following is a list of tools that validate AsyncAPI documents.","toolsList":[{"title":"AMF","description":"AMF (AML Modeling Framework) is an open-source library capable of parsing and validating AML metadata documents.","links":{"docsUrl":"https://a.ml/docs/","repoUrl":"https://github.com/aml-org/amf"},"filters":{"language":[{"name":"Scala","color":"bg-[#FFA299]","borderColor":"border-[#DF301F]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI GitHub Action","description":"This action validates if the AsyncAPI schema file is valid or not.","links":{"websiteUrl":"https://github.com/marketplace/actions/asyncapi-github-action","repoUrl":"https://github.com/WaleedAshraf/asyncapi-github-action"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["github-action","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI Parser","description":"Use this package to parse and validate AsyncAPI documents —either YAML or JSON— in your Node.js or browser application. Updated bundle for the browser is always attached to the GitHub Release.","links":{"repoUrl":"https://github.com/asyncapi/parser-js"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"AsyncAPI Parser","description":"The AsyncAPI Parser validates AsyncAPI documents according to dedicated schemas.","links":{"repoUrl":"https://github.com/asyncapi/parser-go"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":true,"technology":[]}},{"title":"AsyncAPI Parser Wrapper","description":"Use this library to parse and validate AsyncAPI documents — either YAML or JSON — in your Java application. It is a Java wrapper over JavaScript Parser implemented using J2V8.","links":{"repoUrl":"https://github.com/AsyncAPITools/parser-java-wrapper"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"asyncapi-validator","description":"It allows you to validate the schema of your messages against your AsyncAPI schema definition. You can use it with Kafka, RabbitMQ or any other messaging/queue.","links":{"repoUrl":"https://github.com/WaleedAshraf/asyncapi-validator"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI.Net","description":"The AsyncAPI.NET SDK contains a useful object model for AsyncAPI documents in .NET along with common serializers to extract raw OpenAPI JSON and YAML documents from the model.","links":{"websiteUrl":"https://github.com/LEGO/AsyncAPI.NET/","repoUrl":"https://github.com/LEGO/AsyncAPI.NET"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"}],"categories":["converters","code-first","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Spectral","description":"A flexible JSON/YAML linter for creating automated style guides, with baked in support for OpenAPI v3.1, v3.0, and v2.0 as well as AsyncAPI v2.x.","links":{"repoUrl":"https://github.com/stoplightio/spectral"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Compare tools":{"description":"The following is a list of tools that compare AsyncAPI documents.","toolsList":[{"title":"Api-Smart-Diff","description":"It allows you to compare two API documents and classify changes. Supported API specifications: OpenAPI, AsyncAPI, JsonSchema.","links":{"repoUrl":"https://github.com/udamir/api-smart-diff"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"categories":["compare-tool"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI Diff","description":"Diff is a library that compares two AsyncAPI Documents and provides information about the differences by pointing out explicitly information like breaking changes.","links":{"repoUrl":"https://github.com/asyncapi/diff"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["compare-tool"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"jasyncapicmp","description":"Tool/library/maven-plugin for comparing two AsyncAPI versions and evaluating compatibility.","links":{"websiteUrl":"https://siom79.github.io/jasyncapicmp/","repoUrl":"https://github.com/siom79/jasyncapicmp"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["compare-tool"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"CLIs":{"description":"The following is a list of tools that you can work with in terminal or do some CI/CD automation.","toolsList":[{"title":"AsyncAPI CLI","description":"One CLI to rule them all. \nThis is a CLI that aims to integrate all AsyncAPI tools that you need while AsyncAPI document development and maintainance. \nYou can use it to generate docs or code, validate AsyncAPI document and event create new documents.\n","links":{"websiteUrl":"https://www.asyncapi.com/tools/cli","repoUrl":"https://github.com/asyncapi/cli"},"filters":{"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["others","cli"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"AsyncAPI-format","description":"Format an AsyncAPI document by ordering, casing, formatting, and filtering fields.","links":{"repoUrl":"https://github.com/asyncapi/converter-go"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["converter","cli"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Bundlers":{"description":"The following is a list of tools that you can work with to bundle AsyncAPI documents.","toolsList":[{"title":"Api-ref-bundler","description":"It allows you bundle/dereference external/internal $refs in Json based API document. Supported specifications: OpenAPI, AsyncAPI, JsonSchema.","links":{"repoUrl":"https://github.com/udamir/api-ref-bundler"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["bundler"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI Bundler","description":"Combine multiple AsyncAPI specification files into one.","links":{"repoUrl":"https://github.com/asyncapi/bundler"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["bundler"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"IDE Extensions":{"description":"The following is a list of extensions for different IDEs like VSCode, IntelliJ IDEA and others","toolsList":[{"title":"asyncapi-preview","description":"VSCode extension that enables you to:\n - Preview documentation generated using you AsyncAPI document. It uses AsyncAPI React component under the hood,\n - Create AsyncAPI documents faster using SmartPaste functionality\n","links":{"repoUrl":"https://github.com/asyncapi/vs-asyncapi-preview"},"filters":{"technology":[{"name":"VSCode","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"SmartPaste","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ide-extension"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"jAsyncAPI - IDEA plugin","description":"Idea plugin for the java-asyncapi - Helps to edit and validate AsyncAPI schemas.","links":{"websiteUrl":"https://plugins.jetbrains.com/plugin/15673-asyncapi","docsUrl":"https://github.com/asyncapi/jasyncapi-idea-plugin#usage","repoUrl":"https://github.com/asyncapi/jasyncapi-idea-plugin"},"filters":{"language":[{"name":"Kotlin","color":"bg-[#B1ACDF]","borderColor":"border-[#756BD9]"}],"technology":[{"name":"JetBrains","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"IntelliJ IDEA","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ide-extension"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"Others":{"description":"The following is a list of tools that comes under Other category.","toolsList":[{"title":"AsyncAPI CLI","description":"One CLI to rule them all. \nThis is a CLI that aims to integrate all AsyncAPI tools that you need while AsyncAPI document development and maintainance. \nYou can use it to generate docs or code, validate AsyncAPI document and event create new documents.\n","links":{"websiteUrl":"https://www.asyncapi.com/tools/cli","repoUrl":"https://github.com/asyncapi/cli"},"filters":{"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["others","cli"],"hasCommercial":false,"isAsyncAPIOwner":true}}]}} \ No newline at end of file diff --git a/scripts/build-tools.js b/scripts/build-tools.js index 6ec14a172e9..363e3418816 100644 --- a/scripts/build-tools.js +++ b/scripts/build-tools.js @@ -2,19 +2,18 @@ const { getData } = require('./tools/extract-tools-github'); const { convertTools } = require('./tools/tools-object'); const { combineTools } = require('./tools/combine-tools'); const manualTools = require('../config/tools-manual.json') -const automatedTools = require('../config/tools-automated.json') const fs = require('fs'); const { resolve } = require('path'); const buildTools = async () => { try { - // let githubExtractData = await getData(); - // let automatedTools = await convertTools(githubExtractData); - // fs.writeFileSync( - // resolve(__dirname, '../config', 'tools-automated.json'), - // JSON.stringify(automatedTools, null, ' ') - // ); + let githubExtractData = await getData(); + let automatedTools = await convertTools(githubExtractData); + fs.writeFileSync( + resolve(__dirname, '../config', 'tools-automated.json'), + JSON.stringify(automatedTools, null, ' ') + ); await combineTools(automatedTools, manualTools); } catch (err) { console.log(err); diff --git a/scripts/tools/extract-tools-github.js b/scripts/tools/extract-tools-github.js index 439534bbf63..2b2ffb1bf60 100644 --- a/scripts/tools/extract-tools-github.js +++ b/scripts/tools/extract-tools-github.js @@ -1,4 +1,5 @@ const axios = require('axios'); +require('dotenv').config() const getData = async () => { try { @@ -11,6 +12,7 @@ const getData = async () => { }, } ); + return result.data; } catch (err) { console.log(err); diff --git a/scripts/tools/tags-color.js b/scripts/tools/tags-color.js index f3119b1134e..9a18ca2058d 100644 --- a/scripts/tools/tags-color.js +++ b/scripts/tools/tags-color.js @@ -167,6 +167,11 @@ const technologiesColor = [ name: "Flask", color: "bg-[#D7C7F2]", borderColor: "border-[#A387D2]" + }, + { + name: "Nest Js", + color: "bg-[#E1224E]", + borderColor: "border-[#B9012b]" } ] diff --git a/scripts/tools/tools-object.js b/scripts/tools/tools-object.js index 665cab53ddb..e5a30334f7d 100644 --- a/scripts/tools/tools-object.js +++ b/scripts/tools/tools-object.js @@ -60,7 +60,7 @@ async function convertTools(data) { for (let tool of dataArray) { try { - if (tool.name === '.asyncapi-tool') { + if (tool.name.startsWith('.asyncapi-tool')) { // extracting the reference id of the repository which will be used to extract the path of the .asyncapi-tool file in the Tools repository // ex: for a url = "https://api.github.com/repositories/351453552/contents/.asyncapi-tool?ref=61855e7365a881e98c2fe667a658a0005753d873" // the text (id) present after '=' gives us a reference id for the repo From 48ff93dd0dd927dab0395a6aefba010621e65026 Mon Sep 17 00:00:00 2001 From: asyncapi-bot Date: Mon, 24 Jul 2023 18:32:51 +0200 Subject: [PATCH 06/23] docs(generator): update latest generator documentation (#1985) --- pages/docs/tools/generator/usage.md | 11 ++++++----- pages/docs/tools/generator/versioning.md | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/pages/docs/tools/generator/usage.md b/pages/docs/tools/generator/usage.md index 3315bf0fcaa..6b6e7aa150a 100644 --- a/pages/docs/tools/generator/usage.md +++ b/pages/docs/tools/generator/usage.md @@ -111,14 +111,15 @@ Install [Docker](https://docs.docker.com/get-docker/) first, then use docker to docker run --rm -it \ -v [ASYNCAPI SPEC FILE LOCATION]:/app/asyncapi.yml \ -v [GENERATED FILES LOCATION]:/app/output \ -asyncapi/generator [COMMAND HERE] +asyncapi/cli [COMMAND HERE] -# Example that you can run inside the generator directory after cloning this repository. First, you specify the mount in the location of your AsyncAPI specification file and then you mount it in the directory where the generation result should be saved. +# Example that you can run inside the cli directory after cloning this repository. First, you specify the mount in the location of your AsyncAPI specification file and then you mount it in the directory where the generation result should be saved. docker run --rm -it \ --v ${PWD}/test/docs/dummy.yml:/app/asyncapi.yml \ --v ${PWD}/output:/app/output \ -asyncapi/generator -o /app/output /app/asyncapi.yml @asyncapi/html-template --force-write + -v ${PWD}/test/fixtures/asyncapi_v1.yml:/app/asyncapi.yml \ + -v ${PWD}/output:/app/output \ + asyncapi/cli generate fromTemplate -o /app/output /app/asyncapi.yml @asyncapi/html-template --force-write ``` +Note: Use ``` ` ``` instead of `\` for Windows. ### CLI usage with `npx` instead of `npm` diff --git a/pages/docs/tools/generator/versioning.md b/pages/docs/tools/generator/versioning.md index 6c31eb3930a..5409d822bf6 100644 --- a/pages/docs/tools/generator/versioning.md +++ b/pages/docs/tools/generator/versioning.md @@ -11,7 +11,7 @@ Something went wrong: Error: This template is not compatible with the current version of the generator (${generatorVersion}). This template is compatible with the following version range: ${generator}.`) ``` -> Use the following command to check the version of the AsyncAPI CLI you have installed; `asyncapi --version` +> Use the following command to check the version of the AsyncAPI CLI you have installed with all its dependencies, like AsyncAPI Generator; `asyncapi config versions` It is better to lock a specific version of the template and the generator if you plan to use the AsyncAPI CLI and a particular template in production. The differences between using the version of the AsyncAPI CLI you have installed and locking a certain version on production are demonstrated in the following code snippets. From 2eee34afd57c751201171d4d9e5f37e0feaf17f4 Mon Sep 17 00:00:00 2001 From: asyncapi-bot Date: Mon, 24 Jul 2023 18:41:17 +0200 Subject: [PATCH 07/23] docs(generator): update latest generator documentation (#1986) --- .../tools/generator/generator_template.md | 575 ++++++++++++++++++ 1 file changed, 575 insertions(+) create mode 100644 pages/docs/tools/generator/generator_template.md diff --git a/pages/docs/tools/generator/generator_template.md b/pages/docs/tools/generator/generator_template.md new file mode 100644 index 00000000000..dcd75fbc6c4 --- /dev/null +++ b/pages/docs/tools/generator/generator_template.md @@ -0,0 +1,575 @@ +--- +title: "Creating a Generator template" +weight: 170 +--- + +This tutorial teaches you how to create a simple generator template using a Python MQTT client. You'll use the AsyncAPI document and the template you develop to generate Python code. Additionally, you'll create template code with a reusable component to reuse the custom functionality you create and test your code using an MQTT client. + +Suppose you can only sleep when the AC in your bedroom is set to 22 °C, and you can't sleep when the temperature drops or rises above that. You can install a smart monitor in your bedroom that keeps track of the temperature and notifies you to adjust it to your optimum temperature when it fluctuates. You will create a template to alert you when the bedroom's temperature fluctuates from 22 °C. + +In this tutorial: + +- You'll use the [Eclipse Mosquito](https://test.mosquitto.org) **MQTT broker**, which you'll connect to subscribe and publish messages using an MQTT client. +- You'll use [Python Paho-MQTT](https://pypi.org/project/paho-mqtt/) as the **MQTT client** in this project. +- You'll create a React template that will use the MQTT broker to allow you to monitor your bedroom's temperature and notify you when the temperature drops or rises above 22 °C. +- Lastly, create a reusable component for the output code's `sendTemperatureDrop` and `sendTemperatureRise` functions. + +## Background context + +There is a list of [community maintained templates](https://www.asyncapi.com/docs/tools/generator/template#generator-templates-list), but what if you do not find what you need? In that case, you'll create a user-defined template that generates custom output from the generator. +Before you create the template, you'll need to have an [AsyncAPI document](https://www.asyncapi.com/docs/tools/generator/asyncapi-document) that defines the properties you want to use in your template to test against. In this tutorial, you'll use the following template saved in the **test/fixtures/asyncapi.yml** file in your template project directory. + +``` yml + +asyncapi: 2.6.0 + +info: + title: Temperature Service + version: 1.0.0 + description: This service is in charge of processing all the events related to temperature. + +servers: + dev: + url: test.mosquitto.org + protocol: mqtt + +channels: + temperature/changed: + description: Updates the bedroom temperature in the database when the temperatures drops or goes up. + publish: + operationId: temperatureChange + message: + description: Message that is being sent when the temperature in the bedroom changes. + payload: + type: object + additionalProperties: false + properties: + temperatureId: + type: string +components: + schemas: + temperatureId: + type: object + additionalProperties: false + properties: + temperatureId: + type: string +``` + + + +- To generate code, use the [AsyncAPI CLI](https://www.asyncapi.com/tools/cli). If you don't have the CLI installed, follow [CLI installation guide](/docs/tools/generator/installation-guide#asyncapi-cli). +- If you are new to AsyncAPI Generator, check out the following docs: [template development](/docs/tools/generator/template-development), which explains the minimum requirements for a template and possible features. + + + +## Overview of steps + +1. Create a new directory for your template named **python-mqtt-client-template**. +2. Install the AsyncAPI CLI using the command `npm install -g @asyncapi/cli`. +3. Create a new folder **test/fixtures** with a file named **asyncapi.yml** in your fixtures directory. This file is used to define the **structure** of your template. +4. Create a new file named **package.json** in your template directory. This file is used to define the **dependencies** for your template. +5. Create a new file named **index.js** in your **template** directory. This file is used to define the **logic** for your template. +6. Create a **test.py** file to validate the logic of your application. + +Lets break it down: + +### package.json file + +The **package.json** file is used to define the dependencies for your template. Add the following code snippet to your **package.json** file: + +``` json +{ + "name": "python-mqtt-client-template", + "version": "0.0.1", + "description": "A template that generates a Python MQTT client using MQTT.", + "generator": { + "renderer": "react", + "apiVersion": "v1", + "generator": ">=1.10.0 <2.0.0", + "supportedProtocols": ["mqtt"] + }, + "dependencies": { + "@asyncapi/generator-react-sdk": "^0.2.25" + }, + "devDependencies": { + "rimraf": "^5.0.0" + } +} +``` + +Here's what is contained in the code snippet above: + +- **name** -the name of your template. +- **version** - the current version of your template. +- **description** - a description of what your template does. +- **generator** - specify generator [specific configuration](https://www.asyncapi.com/docs/tools/generator/configuration-file). + - **renderer** - can either be [`react`](https://www.asyncapi.com/docs/tools/generator/react-render-engine) or [`nunjucks`](https://www.asyncapi.com/docs/tools/generator/nunjucks-render-engine). In this case the generator will pass your template to the react render engine to generate the output. + - **apiVersion** - specifies which major version of the [Parser-API](https://github.com/asyncapi/parser-api) your template will use. + - **generator** - a string representing the generator version-range your template is compatible with. + - **supportedProtocols** - A list that specifies which protocols are supported by your template. +- **dependencies** - specifies which version of [`@asyncapi/generator-react-sdk`](https://github.com/asyncapi/generator-react-sdk) should be used. + +Run the command `npm install` on your terminal to install the dependencies specified in **package.json**. + +### index.js file + +The **index.js** file is used to define the logic for your template. Inside the template folder, create an **index.js** file and add the code snippet below: + +```js +//1 +import { File } from '@asyncapi/generator-react-sdk' +//2 +export default function ({ asyncapi }) { +//3 + return {asyncapi.info().title()} +} +``` + +The code snippet above does the following: + +1. Import the `generator-react-sdk` dependency. +2. The `asyncapi` argument is an instance of the [AsyncAPI Parser](https://www.asyncapi.com/docs/tools/generator/parser). It will allow you to access the content of the AsyncAPI document in your template using helper functions. +3. The `asyncapi.info().title()` is using the info() helper function to return the info object from the AsyncAPI document illustrated in the code snippet below: + +``` json +info: + title: Temperature Service + version: 1.0.0 + description: This service is in charge of processing all the events related to temperature. +``` + +The `asyncapi.info().title()` returns `Temperature Service`. + +### Test using AsyncAPI CLI + +To see this in action, run `asyncapi generate fromTemplate test/fixtures/asyncapi.yml ./ -o test/project` command on your terminal. If successful, you'll see the message below on your terminal: + +``` cmd +Generation in progress. Keep calm and wait a bit... done +Check out your shiny new generated files at output. +``` + +Navigating to the **test/project** directory. You should see a **client.py** file; the only content is `Temperature Service`. + +Let's break down the previous command: + +- `asyncapi generate fromTemplate` is how you use AsyncAPI generator via the AsyncAPI CLI. +- `test/fixtures/asyncapi.yml` points to your AsyncAPI document. +- `./` specifies the location of your template. +- `-o` specifies where to output the result. + +## Creating a template + +You will create an MQTT-supported template that will generate a Python client from the template and the AsyncAPI document above. + +In this section, you'll: + +1. Write the MQTT client code. +2. Write code to test the client works. +3. Update the template to use the client code. +4. Setup a script to help you run this code. +5. Template your code. + +### 1. Create the client + +The following is the sample code of the Python client you generated [above](#test-using-asyncapi-cli) using the Paho-MQTT library after running the `asyncapi generate fromTemplate test/fixtures/asyncapi.yml ./ -o test/project` command. + +``` python +# 1 +import paho.mqtt.client as mqtt +# 2 +mqttBroker = "test.mosquitto.org" + +class TemperatureServiceClient: + def __init__(self): + # 3 + self.client = mqtt.Client() + # 4 + self.client.connect(mqttBroker) + + + def sendTemperatureChange(self, id): + # 5 + topic = "temperature/changed" + # 6 + self.client.publish(topic, id) +``` + +Make sure you have the Paho-MQTT library installed. You can install it using pip with the `pip install paho-mqtt` command. +Let's break down the previous code snippet: + +1. Imports the MQTT module from the Paho package, which provides the MQTT client functionality. +2. Assigns the MQTT broker address `test.mosquitto.org` to the variable MQTT broker. This specifies the location where the MQTT client will connect to. +3. Defines an instance of the MQTT client object. This object will be used to establish a connection with the MQTT broker and perform MQTT operations. +4. Defines that on client instance creation, it connects to the broker. +5. The `sendTemperatureChange` is a function the client user invokes to publish a message to the broker, and its specific topic. + +In summary, this code sets up an MQTT client using the Paho-MQTT library. It connects to the `test.mosquitto.org` MQTT broker, and the `sendTemperatureChange()` method publishes temperature change information to the `temperature/changed` topic whenever called. + +### 2. Test the client + +You'll interact with the Temperature Service using the client module you created above. You'll create an instance of the client using `client = TemperatureServiceClient()` and then use `client.sendTemperatureChange` function to publish messages that Temperature Service is subscribed to. +Create a **test/project/test.py** file in your project and add the code snippet below: + +``` python +from client import TemperatureServiceClient +from random import randrange +import time + +client = TemperatureServiceClient() + +id_length = 8 +min_value = 10**(id_length-1) # Minimum value with 8 digits (e.g., 10000000) +max_value = 10**id_length - 1 # Maximum value with 8 digits (e.g., 99999999) + +while True: + randomId = randrange(min_value, max_value + 1) + client.sendTemperatureChange(randomId) + print("New temperature detected " + str(randomId) + " sent to temperature/changed") + time.sleep(1) + +``` + +Run the code above in your terminal using the command `python test.py`. You should see output similar to the snippet below logged on your terminal: + +``` cmd +New temperature detected 64250266 sent to temperature/changed +New temperature detected 36947728 sent to temperature/changed +New temperature detected 72955029 sent to temperature/changed +``` + +To make sure your **test.py** and client code works check if the broker really receives temperature-related messages. You can do it using an [MQTT CLI](https://hivemq.github.io/mqtt-cli/) using docker. Run the command `docker run hivemq/mqtt-cli sub -t temperature/changed -h test.mosquitto.org` in your terminal. It will download the image if you don't have it locally, then the CLI will connect to the broker, subscribe to the `temperature/changed` topic and then output the temperature ids on the terminal. + +### 3. Update the template with client code + +Open [**index.js**](#indexjs-file) and copy the content of [**client.py**](#1-create-the-client) and replace `{asyncapi.info().title()}` with it. It should look like the code snippet below now: + +``` js +import { File } from '@asyncapi/generator-react-sdk'; + +export default function ({ asyncapi }) { + return ( + + {`import paho.mqtt.client as mqtt + +mqttBroker = "test.mosquitto.org" + +class TemperatureServiceClient: + def __init__(self): + self.client = mqtt.Client() + self.client.connect(mqttBroker) + + + def sendTemperatureChange(self, id): + topic = "temperature/changed" + self.client.publish(topic, id)`} + + ) +} +``` + +### 4. Write script to run the test code + +In **package.json** you can have the scripts property that you invoke by calling `npm run `. Add these scripts to **package.json**: + +``` json + "scripts": { + "test:clean": "rimraf test/project/client.py", + "test:generate": "asyncapi generate fromTemplate test/fixtures/asyncapi.yml ./ --output test/project --force-write", + "test:start": "python test/project/test.py", + "test": "npm run test:clean && npm run test:generate && npm run test:start" + } +``` + +The 4 scripts above do the following: + +1. `test:clean`: This script uses the `rimraf` package to remove the old version of the file **test/project/client.py** every time you run your test. +2. `test:generate`: This script uses the AsyncAPI CLI to generate a new version of **client.py**. +3. `test:start`: This script runs the python code using **client.py**. +4. `test`: This script runs all the other scripts in proper order. + +Run `npm test` on your terminal to ensure everything works as expected. + +### 5. Template your code + +#### 5a. Add parameters to the configuration file + +You often have different runtime environments in programming, e.g., development and production. You will use different servers to spin both of these instances. You'll have two broker versions, one for production and the other for development. You have defined a dev server in the AsyncAPI document: + +```yml +servers: + dev: + url: test.mosquitto.org + protocol: mqtt +``` + +This will allow you to also define the broker you will use in production in the servers section above. +Therefore, we can template the code `mqttBroker = 'test.mosquitto.org'` in **index.js** so the value is populated dynamically at runtime depending on the specified server environment. + +The generator has a **parameters** object used to define parameters you use to dynamically modify your template code at runtime. It also supports the **server** parameter that defines the server configuration value. Navigate to **package.json** and add the snippet below: + +```json + "generator": { + # ...(redacted for brevity) + "parameters": { + "server": { + "description": "The server you want to use in the code.", + "required": true + } + } + } +``` + +`"required": true`: makes the parameter mandatory and once user forgets to add it to the cli command, a proper error message is yielded. +You'll pass the server to be used to generate your code using `--param server=dev` in the AsyncAPI CLI command. Failure to which you'll get an error: + +```cmd +Generator Error: This template requires the following missing params: server. +``` + +Update your `test:generate` script in **package.json** to include the server param + +```json +test:generate": "asyncapi generate fromTemplate test/fixtures/asyncapi.yml ./ --output test/project --force-write --param server=dev" +``` + +You can now replace the static broker from `mqttBroker = 'test.mosquitto.org'` to `mqttBroker = "${asyncapi.servers().get(params.server).url()}"` in **index.js**. + +Now the template code looks like this: + +``` js +import { File } from '@asyncapi/generator-react-sdk'; + +// notice that now the template not only gets the instance of parsed AsyncAPI document but also the parameters +export default function ({ asyncapi, params }) { + + return ( + + {`import paho.mqtt.client as mqtt + +mqttBroker = "${asyncapi.servers().get(params.server).url()}" + +class TemperatureServiceClient: + def __init__(self): + self.client = mqtt.Client() + self.client.connect(mqttBroker) + + + def sendTemperatureChange(self, id): + topic = "temperature/changed" + self.client.publish(topic, id)`} + + ) +} +``` + +Run `npm test` to validate that your code still works as expected. + +#### 5b. Templating index.js with React + +Python takes indentation very seriously, and our generated output will be Python code. We, therefore, need to make sure the indentation in **index.js** looks right so the generated code is indented correctly. After templating the code in **index.js**, it will look like the following code snippet: + +```js +// 1 +import { File, Text } from '@asyncapi/generator-react-sdk' +export default function ({ asyncapi, params }) { + return ( + + // 2 + import paho.mqtt.client as mqtt + // 3 + mqttBroker = "{asyncapi.servers().get(params.server).url()}" + // 4 + class {asyncapi.info().title().replaceAll(' ', '')}Client: + // 5 + + {`def __init__(self): + self.client = mqtt.Client() + self.client.connect(mqttBroker)`} + + + ) +} +``` + +1. Import the **Text** component that will wrap strings so they are indented properly in the output. Your import statement should now look like this: `import { File, Text } from '@asyncapi/generator-react-sdk'`. +2. When the Paho module import is rendered in **client.py** file, it will add two extra new lines. +3. The broker url is templated in a `Text` component removing the `$` from the string template. +4. Dynamically get the class name **TemperatureServiceClient** from the AsyncAPI document from the **info** object using the Parser API using the code: `asyncapi.info().title()` . It will return `Temperature Service`, then remove the spaces and add `Client` as a suffix. +5. There is no templating needed in the `__init__` function, there is only hardcoded information. + +> If you're on the fence about which templating engine you should use in your template, check out the [React render engine](https://www.asyncapi.com/docs/tools/generator/react-render-engine) and [nunjucks render engine](https://www.asyncapi.com/docs/tools/generator/nunjucks-render-engine) documentation. +In the next section, you'll refactor your template to use React. + +#### 5c. Creating a reusable component + +Suppose you have two [channels](https://www.asyncapi.com/docs/concepts/channel), one to watch if the temperature drop below 22 °C and one to check if the temperature is above 22 °C, the generated output code would look like this: + +```python +import paho.mqtt.client as mqtt + +mqttBroker = "test.mosquitto.org" + +class TemperatureServiceClient: + + def __init__(self): + self.client = mqtt.Client() + self.client.connect(mqttBroker) + + def sendTemperatureDrop(self, id): + topic = "temperature/dropped" + self.client.publish(topic, id) + def sendTemperatureRise(self, id): + topic = "temperature/risen" + self.client.publish(topic, id) + +``` + +You'll then need to template to dynamically generate `sendTemperatureDrop` and `sendTemperatureRise` functions in the generated code based off the AsyncAPI document content. The goal is to write template code that returns functions for channels that the Temperature Service application is subscribed to. The template code to generate these functions will look like this: + +```js + + + +``` + +It's recommended to put reusable components outside template directory in a new directory called **components**. You'll create a component that will dynamically generate functions in the output for as many channels as there are in your AsyncAPI document that contain a `publish` operation. Add the following code in **components/TopicFunction.js** file: + +```js +/* + * This component returns a block of functions that user can use to send messages to specific topic. + * As input it requires a list of Channel models from the parsed AsyncAPI document + */ +export function TopicFunction({ channels }) { + const topicsDetails = getTopics(channels) + let functions = '' + + topicsDetails.forEach((t) => { + functions += `def send${t.name}(self, id): + topic = "${t.topic}" + self.client.publish(topic, id)\n` + }) + + return functions +} + +/* + * This function returns a list of objects, one for each channel with two properties, name and topic + * name - holds information about the operationId provided in the AsyncAPI document + * topic - holds information about the address of the topic + * + * As input it requires a list of Channel models from the parsed AsyncAPI document + */ +function getTopics(channels) { + const channelsCanSendTo = channels + let topicsDetails = [] + + channelsCanSendTo.forEach((ch) => { + const topic = {} + const operationId = ch.operations().filterByReceive()[0].id() + topic.name = operationId.charAt(0).toUpperCase() + operationId.slice(1) + topic.topic = ch.address() + + topicsDetails.push(topic) + }) + + return topicsDetails +} +``` + +`{ channels }`: the `TopicFunction` component accepts a custom prop called channels and in your template code +`getTopics(channels)`: Returns a list of objects, one for each channel with two properties; name and topic. The **name** holds information about the `operationId` provided in the AsyncAPI document while the **topic** holds information about the address of the topic. + +Import the `TopicFunction` component in your template code in **index.js** and add the template code to generate the functions to topics that the `Temperature Service` application is subscribed to. In your case, the final version of your template code should look like this: + +```js +import { File, Text } from '@asyncapi/generator-react-sdk' +import { TopicFunction } from '../components/TopicFunction' + +export default function ({ asyncapi, params }) { + return ( + + import paho.mqtt.client as mqtt + + mqttBroker = "{asyncapi.servers().get(params.server).url()}" + + class {asyncapi.info().title().replaceAll(' ', '')}Client: + + + {`def __init__(self): + self.client = mqtt.Client() + self.client.connect(mqttBroker)`} + + + + + + + ) +} + +``` + +Run `npm test` on your terminal to ensure everything works as expected. + +In the next section, you'll add another channel to **asyncapi.yml** file called `temperature/dropped` and `temperature/risen` then run the template again to make sure it still works as expected. + +#### 5d. Update AsyncAPI document + +Update the AsyncAPI document to use two channels: + +```yml +channels: + temperature/dropped: + description: Notifies the user when the temperature drops past a certain point. + publish: + operationId: temperatureDrop + message: + description: Message that is being sent when the temperature drops past a certain point. + payload: + type: object + additionalProperties: false + properties: + temperatureId: + type: string + + temperature/risen: + description: Notifies the user when the temperature rises past a certain point. + publish: + operationId: temperatureRise + message: + description: Message that is being sent when the temperature rises past a certain point. + payload: + type: object + additionalProperties: false + properties: + temperatureId: + type: string +``` + +And update your test script in test.py to test the two functions as below: + +```py + client.sendTemperatureDrop(randomId) + print("Temperature drop detected " + str(randomId) + " sent to temperature/dropped") + client.sendTemperatureRise(randomId) + print("Temperature rise detected " + str(randomId) + " sent to temperature/risen") +``` + +Run `npm test` to validate that everything works as expected. You should see logs similar to the snippet below in your terminal: + +```cmd +Temperature drop detected 49040460 sent to temperature/dropped +Temperature rise detected 49040460 sent to temperature/risen +Temperature drop detected 66943992 sent to temperature/dropped +Temperature rise detected 66943992 sent to temperature/risen +``` + +## Where to go from here? + +Great job completing this tutorial! You have learnt how to use an AsyncAPI file to create a Python MQTT template and used it with the Paho-MQTT library in Python to connect to an MQTT broker and publish messages.😃 + +If you want to tinker with a completed template and see what it would look like in production, check out the [Paho-MQTT template](https://github.com/derberg/python-mqtt-client-template/tree/v1.0.0). You can also check out the accompanying [article about creating MQTT client code](https://www.brainfart.dev/blog/asyncapi-codegen-python). + +You can also check out the [MQTT beginners guide]((https://medium.com/python-point/mqtt-basics-with-python-examples-7c758e605d4)) tutorial to learn more about asynchronous messaging using MQTT. From e017546fdbfc0ed44a5c7cccda262cc2a7379e42 Mon Sep 17 00:00:00 2001 From: asyncapi-bot Date: Tue, 25 Jul 2023 02:32:19 +0200 Subject: [PATCH 08/23] chore: update meetings.json and newsrooom_videos.json (#1989) --- config/newsroom_videos.json | 12 ++-- dashboard.json | 131 +++++++++++++++++------------------- 2 files changed, 69 insertions(+), 74 deletions(-) diff --git a/config/newsroom_videos.json b/config/newsroom_videos.json index 33910029c84..544b6ff4eed 100644 --- a/config/newsroom_videos.json +++ b/config/newsroom_videos.json @@ -1,10 +1,4 @@ [ - { - "image_url": "https://i.ytimg.com/vi/a2luTxpmkfs/hqdefault.jpg", - "title": "Spec 3.0 Docs (July 20th 2023)", - "description": "https://github.com/asyncapi/community/issues/790.", - "videoId": "a2luTxpmkfs" - }, { "image_url": "https://i.ytimg.com/vi/GAjlJFXjMh8/hqdefault.jpg", "title": "Design meeting #2", @@ -28,5 +22,11 @@ "title": "Spec 3.0 DOCS Meeting (July 6th 2023)", "description": "https://github.com/asyncapi/community/issues/774.", "videoId": "Lunp8eSLONc" + }, + { + "image_url": "https://i.ytimg.com/vi/hc0Lxr3G8T4/hqdefault.jpg", + "title": "Spec 3.0 (July 5th 2023)", + "description": "https://github.com/asyncapi/community/issues/760.", + "videoId": "hc0Lxr3G8T4" } ] \ No newline at end of file diff --git a/dashboard.json b/dashboard.json index e3ad886f03f..b79b1001bf1 100644 --- a/dashboard.json +++ b/dashboard.json @@ -16,17 +16,6 @@ ], "score": 53.988822684860644 }, - { - "id": "PR_kwDOCHlHJM5SLlyl", - "isPR": true, - "isAssigned": false, - "title": "docs: create generator template tutorial", - "author": "Florence-Njeri", - "resourcePath": "/asyncapi/generator/pull/978", - "repo": "asyncapi/generator", - "labels": [], - "score": 33.02507770616476 - }, { "id": "I_kwDOFLhIt84-OUI3", "isPR": false, @@ -47,17 +36,6 @@ ], "score": 32.45072852866624 }, - { - "id": "I_kwDOBGu-185CELGB", - "isPR": false, - "isAssigned": false, - "title": "Work on 3.0 release", - "author": "jonaslagoni", - "resourcePath": "/asyncapi/spec/issues/691", - "repo": "asyncapi/spec", - "labels": [], - "score": 22.68679251119144 - }, { "id": "MDU6SXNzdWU5OTMxODc5ODM=", "isPR": false, @@ -142,37 +120,69 @@ "score": 16.65612614745701 }, { - "id": "PR_kwDOBW5R_c5KIyGW", + "id": "PR_kwDOGPFxkc5Ey7vh", "isPR": true, - "isAssigned": true, - "title": "docs: code-examples", + "isAssigned": false, + "title": "feat: share spec feature", + "author": "AceTheCreator", + "resourcePath": "/asyncapi/server-api/pull/213", + "repo": "asyncapi/server-api", + "labels": [ + { + "name": "stale", + "color": "ededed" + } + ], + "score": 15.794602381209232 + }, + { + "id": "PR_kwDOFDnrNc5RUbi_", + "isPR": true, + "isAssigned": false, + "title": "fix: help command", "author": "sambhavgupta0705", - "resourcePath": "/asyncapi/website/pull/1349", - "repo": "asyncapi/website", + "resourcePath": "/asyncapi/cli/pull/593", + "repo": "asyncapi/cli", "labels": [], - "score": 16.65612614745701 + "score": 14.645904026212197 }, { - "id": "PR_kwDOFLhIt85RTiHb", + "id": "PR_kwDOFLhIt85TFWOL", "isPR": true, "isAssigned": false, - "title": "docs: add flowchart for GSoC23 project in README.md", + "title": "ci: verify changes to Maintainers.yaml made by the bot", "author": "14Richa", - "resourcePath": "/asyncapi/community/pull/719", + "resourcePath": "/asyncapi/community/pull/750", "repo": "asyncapi/community", + "labels": [ + { + "name": "do-not-merge", + "color": "B60205" + } + ], + "score": 13.497205671215161 + }, + { + "id": "I_kwDOCVQpZM5M_dcV", + "isPR": false, + "isAssigned": true, + "title": "DocsUI: Messages Object output", + "author": "mcturco", + "resourcePath": "/asyncapi/asyncapi-react/issues/618", + "repo": "asyncapi/asyncapi-react", "labels": [], - "score": 16.36895155870775 + "score": 13.210031082465903 }, { - "id": "PR_kwDOFDnrNc5RUbi_", + "id": "PR_kwDOFLhIt85Vmgtj", "isPR": true, "isAssigned": false, - "title": "fix: help command", - "author": "sambhavgupta0705", - "resourcePath": "/asyncapi/cli/pull/593", - "repo": "asyncapi/cli", + "title": "feat: youtube to anchor workflow", + "author": "AnimeshKumar923", + "resourcePath": "/asyncapi/community/pull/805", + "repo": "asyncapi/community", "labels": [], - "score": 14.645904026212197 + "score": 12.922856493716644 } ], "goodFirstIssues": [ @@ -191,36 +201,6 @@ } ] }, - { - "id": "I_kwDOCHlHJM5rH7-B", - "title": "[📑 Docs]: Update versioning docs with info how to check generator version", - "isAssigned": false, - "resourcePath": "/asyncapi/generator/issues/1007", - "repo": "asyncapi/generator", - "author": "derberg", - "area": "docs", - "labels": [ - { - "name": "📑 docs", - "color": "E50E99" - } - ] - }, - { - "id": "I_kwDOCHlHJM5rH6bF", - "title": "[📑 Docs]: Update usage doc with info about new docker image", - "isAssigned": false, - "resourcePath": "/asyncapi/generator/issues/1006", - "repo": "asyncapi/generator", - "author": "derberg", - "area": "docs", - "labels": [ - { - "name": "📑 docs", - "color": "E50E99" - } - ] - }, { "id": "I_kwDOFi_gUM5rHafV", "title": "Glee crashes when body is not proper json in http request", @@ -730,6 +710,21 @@ } ] }, + { + "id": "I_kwDOE8Qh385hfhvh", + "title": "[📑 Docs]: Use code to represent the internal models", + "isAssigned": false, + "resourcePath": "/asyncapi/modelina/issues/1182", + "repo": "asyncapi/modelina", + "author": "jonaslagoni", + "area": "Unknown", + "labels": [ + { + "name": "📑 docs", + "color": "E50E99" + } + ] + }, { "id": "I_kwDOFi_gUM5hAZlI", "title": "Better logging for MQTT adapter", From 6efebf184c983008fb6f32ef3b581002c85a395f Mon Sep 17 00:00:00 2001 From: asyncapi-bot Date: Wed, 26 Jul 2023 02:30:20 +0200 Subject: [PATCH 09/23] chore: update meetings.json and newsrooom_videos.json (#1990) --- config/meetings.json | 7 +++++++ config/newsroom_videos.json | 12 ++++++------ dashboard.json | 32 +++++++++++--------------------- 3 files changed, 24 insertions(+), 27 deletions(-) diff --git a/config/meetings.json b/config/meetings.json index d3459311b56..e3ead11562f 100644 --- a/config/meetings.json +++ b/config/meetings.json @@ -229,5 +229,12 @@ "url": "https://github.com/asyncapi/community/issues/800", "banner": "", "date": "2023-07-18T08:00:00.000Z" + }, + { + "title": "Spec 3.0 Meeting", + "calLink": "https://www.google.com/calendar/event?eid=aTBkZHJ2YWczcG1hZWFqbTFlMWowZjZnbzAgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/812", + "banner": "", + "date": "2023-08-02T16:00:00.000Z" } ] \ No newline at end of file diff --git a/config/newsroom_videos.json b/config/newsroom_videos.json index 544b6ff4eed..3eda25f1a2d 100644 --- a/config/newsroom_videos.json +++ b/config/newsroom_videos.json @@ -1,4 +1,10 @@ [ + { + "image_url": "https://i.ytimg.com/vi/CagY5otdY14/hqdefault.jpg", + "title": "Community Meeting (July 25th 2023)", + "description": "https://github.com/asyncapi/community/issues/798.", + "videoId": "CagY5otdY14" + }, { "image_url": "https://i.ytimg.com/vi/GAjlJFXjMh8/hqdefault.jpg", "title": "Design meeting #2", @@ -22,11 +28,5 @@ "title": "Spec 3.0 DOCS Meeting (July 6th 2023)", "description": "https://github.com/asyncapi/community/issues/774.", "videoId": "Lunp8eSLONc" - }, - { - "image_url": "https://i.ytimg.com/vi/hc0Lxr3G8T4/hqdefault.jpg", - "title": "Spec 3.0 (July 5th 2023)", - "description": "https://github.com/asyncapi/community/issues/760.", - "videoId": "hc0Lxr3G8T4" } ] \ No newline at end of file diff --git a/dashboard.json b/dashboard.json index b79b1001bf1..32c10b7e160 100644 --- a/dashboard.json +++ b/dashboard.json @@ -146,6 +146,17 @@ "labels": [], "score": 14.645904026212197 }, + { + "id": "PR_kwDOFLhIt85Vmgtj", + "isPR": true, + "isAssigned": false, + "title": "feat: youtube to anchor workflow", + "author": "AnimeshKumar923", + "resourcePath": "/asyncapi/community/pull/805", + "repo": "asyncapi/community", + "labels": [], + "score": 13.497205671215161 + }, { "id": "PR_kwDOFLhIt85TFWOL", "isPR": true, @@ -172,17 +183,6 @@ "repo": "asyncapi/asyncapi-react", "labels": [], "score": 13.210031082465903 - }, - { - "id": "PR_kwDOFLhIt85Vmgtj", - "isPR": true, - "isAssigned": false, - "title": "feat: youtube to anchor workflow", - "author": "AnimeshKumar923", - "resourcePath": "/asyncapi/community/pull/805", - "repo": "asyncapi/community", - "labels": [], - "score": 12.922856493716644 } ], "goodFirstIssues": [ @@ -606,16 +606,6 @@ } ] }, - { - "id": "I_kwDOBGu-185myWAv", - "title": "update release workflow in release branch", - "isAssigned": false, - "resourcePath": "/asyncapi/spec/issues/938", - "repo": "asyncapi/spec", - "author": "derberg", - "area": "ci-cd", - "labels": [] - }, { "id": "I_kwDOBW5R_c5mwLzC", "title": "[📑 Docs]: Create an Onboarding guide for technical writers", From 67885a2eb0e04b2a60ae75c8de424eec0777ff76 Mon Sep 17 00:00:00 2001 From: asyncapi-bot Date: Wed, 26 Jul 2023 16:13:21 +0200 Subject: [PATCH 10/23] docs(cli): update latest cli documentation (#1992) --- pages/docs/tools/cli/usage.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pages/docs/tools/cli/usage.md b/pages/docs/tools/cli/usage.md index 8f04f8fce18..741fef14e13 100644 --- a/pages/docs/tools/cli/usage.md +++ b/pages/docs/tools/cli/usage.md @@ -29,7 +29,7 @@ $ npm install -g @asyncapi/cli $ asyncapi COMMAND running command... $ asyncapi (--version) -@asyncapi/cli/0.51.1 linux-x64 node-v18.16.1 +@asyncapi/cli/0.51.2 linux-x64 node-v18.17.0 $ asyncapi --help [COMMAND] USAGE $ asyncapi COMMAND @@ -91,7 +91,7 @@ EXAMPLES $ asyncapi bundle ./asyncapi.yaml ./features.yaml --base ./asyncapi.yaml --reference-into-components ``` -_See code: [src/commands/bundle.ts](https://github.com/asyncapi/cli/blob/v0.51.1/src/commands/bundle.ts)_ +_See code: [src/commands/bundle.ts](https://github.com/asyncapi/cli/blob/v0.51.2/src/commands/bundle.ts)_ ## `asyncapi config` @@ -105,7 +105,7 @@ DESCRIPTION CLI config settings ``` -_See code: [src/commands/config/index.ts](https://github.com/asyncapi/cli/blob/v0.51.1/src/commands/config/index.ts)_ +_See code: [src/commands/config/index.ts](https://github.com/asyncapi/cli/blob/v0.51.2/src/commands/config/index.ts)_ ## `asyncapi config context` @@ -234,7 +234,7 @@ DESCRIPTION Convert asyncapi documents older to newer versions ``` -_See code: [src/commands/convert.ts](https://github.com/asyncapi/cli/blob/v0.51.1/src/commands/convert.ts)_ +_See code: [src/commands/convert.ts](https://github.com/asyncapi/cli/blob/v0.51.2/src/commands/convert.ts)_ ## `asyncapi diff OLD NEW` @@ -289,7 +289,7 @@ DESCRIPTION Find diff between two asyncapi files ``` -_See code: [src/commands/diff.ts](https://github.com/asyncapi/cli/blob/v0.51.1/src/commands/diff.ts)_ +_See code: [src/commands/diff.ts](https://github.com/asyncapi/cli/blob/v0.51.2/src/commands/diff.ts)_ ## `asyncapi generate` @@ -303,7 +303,7 @@ DESCRIPTION Generate typed models or other things like clients, applications or docs using AsyncAPI Generator templates. ``` -_See code: [src/commands/generate/index.ts](https://github.com/asyncapi/cli/blob/v0.51.1/src/commands/generate/index.ts)_ +_See code: [src/commands/generate/index.ts](https://github.com/asyncapi/cli/blob/v0.51.2/src/commands/generate/index.ts)_ ## `asyncapi generate fromTemplate ASYNCAPI TEMPLATE` @@ -432,7 +432,7 @@ DESCRIPTION Creates a new asyncapi file ``` -_See code: [src/commands/new/index.ts](https://github.com/asyncapi/cli/blob/v0.51.1/src/commands/new/index.ts)_ +_See code: [src/commands/new/index.ts](https://github.com/asyncapi/cli/blob/v0.51.2/src/commands/new/index.ts)_ ## `asyncapi new file` @@ -520,7 +520,7 @@ EXAMPLES $ asyncapi optimize ./asyncapi.yaml --optimization=remove-components,reuse-components,move-to-components --output=terminal --no-tty ``` -_See code: [src/commands/optimize.ts](https://github.com/asyncapi/cli/blob/v0.51.1/src/commands/optimize.ts)_ +_See code: [src/commands/optimize.ts](https://github.com/asyncapi/cli/blob/v0.51.2/src/commands/optimize.ts)_ ## `asyncapi start` @@ -534,7 +534,7 @@ DESCRIPTION Start asyncapi studio ``` -_See code: [src/commands/start/index.ts](https://github.com/asyncapi/cli/blob/v0.51.1/src/commands/start/index.ts)_ +_See code: [src/commands/start/index.ts](https://github.com/asyncapi/cli/blob/v0.51.2/src/commands/start/index.ts)_ ## `asyncapi start studio` @@ -578,5 +578,5 @@ DESCRIPTION validate asyncapi file ``` -_See code: [src/commands/validate.ts](https://github.com/asyncapi/cli/blob/v0.51.1/src/commands/validate.ts)_ +_See code: [src/commands/validate.ts](https://github.com/asyncapi/cli/blob/v0.51.2/src/commands/validate.ts)_ From cb5354b1db4dfa6e511734253cab670efe9995d9 Mon Sep 17 00:00:00 2001 From: Shubham Sharma Date: Wed, 26 Jul 2023 20:43:16 +0530 Subject: [PATCH 11/23] fix: made the links width 100% (#1955) Co-authored-by: Lukasz Gornicki --- components/navigation/DocsNavItem.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/components/navigation/DocsNavItem.js b/components/navigation/DocsNavItem.js index dcf17037f70..7f32090de04 100644 --- a/components/navigation/DocsNavItem.js +++ b/components/navigation/DocsNavItem.js @@ -1,25 +1,25 @@ import Link from 'next/link'; function isActiveSlug(slug, activeSlug, sectionSlug) { - if(slug === '/docs' || (sectionSlug !== undefined && slug === sectionSlug)) { + if (slug === '/docs' || (sectionSlug !== undefined && slug === sectionSlug)) { return (slug == activeSlug) } - + const partialSlug = slug.split('/'); const partialActiveSlug = activeSlug.split('/'); const activeParts = partialActiveSlug.filter((a, idx) => a === partialSlug[idx]); return activeParts.length === partialSlug.length; } -export default function DocsNavItem({ title, slug, href, activeSlug, sectionSlug, onClick = () => {}, defaultClassName = '', inactiveClassName = '', activeClassName = '', bucket }) { +export default function DocsNavItem({ title, slug, href, activeSlug, sectionSlug, onClick = () => { }, defaultClassName = '', inactiveClassName = '', activeClassName = '', bucket }) { const isActive = isActiveSlug(slug, activeSlug, sectionSlug); - const classes = `${isActive ? activeClassName : inactiveClassName} ${defaultClassName} inline-block`; + const classes = `${isActive ? activeClassName : inactiveClassName} ${defaultClassName} inline-block w-full`; return ( -
+
); -} \ No newline at end of file +} From d1c2ecf192021de2a9eb4baea917f2dcd99ce8a9 Mon Sep 17 00:00:00 2001 From: asyncapi-bot Date: Wed, 26 Jul 2023 17:49:50 +0200 Subject: [PATCH 12/23] docs(cli): update latest cli documentation (#1993) --- pages/docs/tools/cli/index.md | 69 ++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/pages/docs/tools/cli/index.md b/pages/docs/tools/cli/index.md index 37eccf813f5..7a28241c630 100644 --- a/pages/docs/tools/cli/index.md +++ b/pages/docs/tools/cli/index.md @@ -3,4 +3,71 @@ title: 'Introduction' weight: 20 --- -The AsyncAPI CLI is a tool you can use to work with your AsyncAPI documents. You can use the CLI to validate AsyncAPI documents, use the Generator tool, and even create new AsyncAPI documents. + +The AsyncAPI CLI is a command-line tool that provides a set of commands for working with AsyncAPI documents. AsyncAPI is a specification for describing asynchronous APIs, which allows developers to define the structure of messages exchanged between different parts of their applications. The AsyncAPI CLI simplifies creating, validating, bundling, and manipulating AsyncAPI documents, making it easier to work with asynchronous APIs. + +## Features + +The AsyncAPI CLI offers the following key features: + +* Creation: New AsyncAPI documents can be created from scratch using the CLI, which is useful when starting a new project or creating a new version of an existing API. + +* Validation: AsyncAPI documents can be quickly and easily validated using the [AsyncAPI Parser](https://github.com/asyncapi/parser-js), which ensures that the documents conform to the AsyncAPI specification and catches errors early in the development process. + +* Conversion: The AsyncAPI CLI can convert AsyncAPI documents from one version to another, which is helpful for migrating APIs to a newer version of the AsyncAPI specification. + +* Difference: The AsyncAPI CLI can be used to find the differences between two AsyncAPI documents, which helps compare different versions of an API or identify changes made to an API. + +* Generation: The AsyncAPI CLI leverages AsyncAPI libraries like [Generator](https://github.com/asyncapi/generator) and [Modelina](https://github.com/asyncapi/modelina), which allow you to generate various types of documentation, applications, and models in different programming languages. This feature can save significant time and effort when creating new APIs. + +* Optimize: Using [Optimizer](https://github.com/asyncapi/optimizer/), the AsyncAPI CLI can be used to optimize an AsyncAPI specification file which can optimize the structure of the AsyncAPI document to make it smaller and without repetition. + +* Start: The AsyncAPI CLI can be used to start [AsyncAPI Studio](https://studio.asyncapi.com/) locally, which the user can use to view, edit, and test AsyncAPI documents. + +To summarize, the AsyncAPI CLI offers the following features and process flow, as shown in the diagram below: + +```mermaid +graph TD; +A[AsyncAPI Document] +B[Creation] +J[Studio - Editor] +I[Optimization] +D[Validation] +C[Generation] +F[Apps/Docs] +G[Models] +H[Diff] +K[Bundling] +E[Conversion] +A-->B; +A-->D; +A-->C; +C-->F +C-->G +A-->H; +A-->I; +A-->J; +A-->E; +A-->K; +``` + +## CLI flow + +The following flowchart illustrates the process flow of the AsyncAPI CLI: + +```mermaid +graph TD; +A[Start] --> B[User runs the AsyncAPI CLI] +B --> C[User issues a command] +C --> D[CLI processes the command and runs the corresponding operation] +D --> |Is the operation successful?| E{Yes} +D --> |Is the operation recoverable?| F{Yes} +E --> G[CLI returns the results of the operation to the user] +F --> |Operation Error| H[CLI displays an error message and suggests possible next steps] +G --> J[User receives the results] +H --> I[User follows suggested steps to recover] +I --> C[User reissues the corrected command] +J[User terminates the AsyncAPI CLI] --> K[End] +``` + +This flowchart shows the high-level process that occurs when using the AsyncAPI CLI. The user starts by running a command (such as `validate`, `generate`, or `start`), which the CLI processes. The CLI then performs the corresponding operation (such as validating or generating an AsyncAPI document) and returns the results to the user. If an error occurs, the CLI displays an error message and suggests possible next steps for the user. From 044d59062a02e64bc185740a7d870fa6820d7098 Mon Sep 17 00:00:00 2001 From: asyncapi-bot Date: Thu, 27 Jul 2023 02:28:46 +0200 Subject: [PATCH 13/23] chore: update meetings.json and newsrooom_videos.json (#2005) --- dashboard.json | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/dashboard.json b/dashboard.json index 32c10b7e160..97a3ff85211 100644 --- a/dashboard.json +++ b/dashboard.json @@ -155,7 +155,7 @@ "resourcePath": "/asyncapi/community/pull/805", "repo": "asyncapi/community", "labels": [], - "score": 13.497205671215161 + "score": 14.07155484871368 }, { "id": "PR_kwDOFLhIt85TFWOL", @@ -186,6 +186,40 @@ } ], "goodFirstIssues": [ + { + "id": "I_kwDOBW5R_c5sqLtN", + "title": "[📑 Docs]: import Glee docs under tools folder", + "isAssigned": false, + "resourcePath": "/asyncapi/website/issues/2003", + "repo": "asyncapi/website", + "author": "AnimeshKumar923", + "area": "docs", + "labels": [ + { + "name": "📑 docs", + "color": "E50E99" + } + ] + }, + { + "id": "I_kwDOBW5R_c5soAAM", + "title": "Create a research page to have participants sign up for the research study", + "isAssigned": false, + "resourcePath": "/asyncapi/website/issues/1991", + "repo": "asyncapi/website", + "author": "Mayaleeeee", + "area": "design", + "labels": [ + { + "name": "enhancement", + "color": "84b6eb" + }, + { + "name": "🎨 design", + "color": "0D67D3" + } + ] + }, { "id": "I_kwDOBW5R_c5rh81V", "title": "[📑 Docs]: suggestions on 'create-asyncapi-document.md' file", From f7c797e9c6e086f2f42eb100c2444e1bf649b846 Mon Sep 17 00:00:00 2001 From: asyncapi-bot Date: Fri, 28 Jul 2023 02:28:47 +0200 Subject: [PATCH 14/23] chore: update meetings.json and newsrooom_videos.json (#2006) --- config/meetings.json | 14 -------------- dashboard.json | 41 +++++++++++++++++++++++------------------ 2 files changed, 23 insertions(+), 32 deletions(-) diff --git a/config/meetings.json b/config/meetings.json index e3ead11562f..0e75f7b33ad 100644 --- a/config/meetings.json +++ b/config/meetings.json @@ -1,18 +1,4 @@ [ - { - "title": "Community Meeting", - "calLink": "https://www.google.com/calendar/event?eid=MzgwdmZiMTc4cnBmbTUzdWVlbmM4aWYyM2MgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", - "url": "https://github.com/asyncapi/community/issues/659", - "banner": "https://user-images.githubusercontent.com/40604284/229763606-c0b6ed3b-e120-427c-b87d-357856d92777.png", - "date": "2023-04-18T16:00:00.000Z" - }, - { - "title": "Adding support for non-JSON schemas", - "calLink": "https://www.google.com/calendar/event?eid=dTlrM2s3Nmpqcjk2bWszYW83NmJzNnN0cm8gY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", - "url": "https://github.com/asyncapi/community/issues/668", - "banner": "", - "date": "2023-04-18T14:00:00.000Z" - }, { "title": "Spec 3.0 Meeting", "calLink": "https://www.google.com/calendar/event?eid=Z2l0am1xbTBhcm8xa2sxc2dyOGdoaXRmZTQgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", diff --git a/dashboard.json b/dashboard.json index 97a3ff85211..0f03b47ab6c 100644 --- a/dashboard.json +++ b/dashboard.json @@ -135,6 +135,17 @@ ], "score": 15.794602381209232 }, + { + "id": "PR_kwDOFLhIt85Vmgtj", + "isPR": true, + "isAssigned": false, + "title": "feat: youtube to anchor workflow", + "author": "AnimeshKumar923", + "resourcePath": "/asyncapi/community/pull/805", + "repo": "asyncapi/community", + "labels": [], + "score": 14.645904026212197 + }, { "id": "PR_kwDOFDnrNc5RUbi_", "isPR": true, @@ -147,14 +158,19 @@ "score": 14.645904026212197 }, { - "id": "PR_kwDOFLhIt85Vmgtj", - "isPR": true, + "id": "MDU6SXNzdWUxMjMwODQwMDM4", + "isPR": false, "isAssigned": false, - "title": "feat: youtube to anchor workflow", - "author": "AnimeshKumar923", - "resourcePath": "/asyncapi/community/pull/805", - "repo": "asyncapi/community", - "labels": [], + "title": "Usages of allOf within message payload could be flattened", + "author": "jamescrowley", + "resourcePath": "/asyncapi/asyncapi-react/issues/596", + "repo": "asyncapi/asyncapi-react", + "labels": [ + { + "name": "stale", + "color": "ededed" + } + ], "score": 14.07155484871368 }, { @@ -172,17 +188,6 @@ } ], "score": 13.497205671215161 - }, - { - "id": "I_kwDOCVQpZM5M_dcV", - "isPR": false, - "isAssigned": true, - "title": "DocsUI: Messages Object output", - "author": "mcturco", - "resourcePath": "/asyncapi/asyncapi-react/issues/618", - "repo": "asyncapi/asyncapi-react", - "labels": [], - "score": 13.210031082465903 } ], "goodFirstIssues": [ From 6b6c96fc0a16b455958082b2ed6e13879150e2de Mon Sep 17 00:00:00 2001 From: asyncapi-bot Date: Sat, 29 Jul 2023 02:28:11 +0200 Subject: [PATCH 15/23] chore: update meetings.json and newsrooom_videos.json (#2009) --- config/meetings.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config/meetings.json b/config/meetings.json index 0e75f7b33ad..4ff41cecd08 100644 --- a/config/meetings.json +++ b/config/meetings.json @@ -222,5 +222,12 @@ "url": "https://github.com/asyncapi/community/issues/812", "banner": "", "date": "2023-08-02T16:00:00.000Z" + }, + { + "title": "Community Meeting", + "calLink": "https://www.google.com/calendar/event?eid=YmlybTZwODdmMzBnNGg0b3J1OWxmdnBxNmMgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/818", + "banner": "https://user-images.githubusercontent.com/40604284/256949583-958c34c8-4256-4ac5-852b-e00ec094fad0.png", + "date": "2023-08-08T16:00:00.000Z" } ] \ No newline at end of file From 8d1a16012559e5b3e13cf091d960072be7becfb9 Mon Sep 17 00:00:00 2001 From: asyncapi-bot Date: Mon, 31 Jul 2023 10:20:23 +0200 Subject: [PATCH 16/23] docs(cli): update latest cli documentation (#2012) --- pages/docs/tools/cli/usage.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pages/docs/tools/cli/usage.md b/pages/docs/tools/cli/usage.md index 741fef14e13..01f6093db8d 100644 --- a/pages/docs/tools/cli/usage.md +++ b/pages/docs/tools/cli/usage.md @@ -29,7 +29,7 @@ $ npm install -g @asyncapi/cli $ asyncapi COMMAND running command... $ asyncapi (--version) -@asyncapi/cli/0.51.2 linux-x64 node-v18.17.0 +@asyncapi/cli/0.51.3 linux-x64 node-v18.17.0 $ asyncapi --help [COMMAND] USAGE $ asyncapi COMMAND @@ -91,7 +91,7 @@ EXAMPLES $ asyncapi bundle ./asyncapi.yaml ./features.yaml --base ./asyncapi.yaml --reference-into-components ``` -_See code: [src/commands/bundle.ts](https://github.com/asyncapi/cli/blob/v0.51.2/src/commands/bundle.ts)_ +_See code: [src/commands/bundle.ts](https://github.com/asyncapi/cli/blob/v0.51.3/src/commands/bundle.ts)_ ## `asyncapi config` @@ -105,7 +105,7 @@ DESCRIPTION CLI config settings ``` -_See code: [src/commands/config/index.ts](https://github.com/asyncapi/cli/blob/v0.51.2/src/commands/config/index.ts)_ +_See code: [src/commands/config/index.ts](https://github.com/asyncapi/cli/blob/v0.51.3/src/commands/config/index.ts)_ ## `asyncapi config context` @@ -234,7 +234,7 @@ DESCRIPTION Convert asyncapi documents older to newer versions ``` -_See code: [src/commands/convert.ts](https://github.com/asyncapi/cli/blob/v0.51.2/src/commands/convert.ts)_ +_See code: [src/commands/convert.ts](https://github.com/asyncapi/cli/blob/v0.51.3/src/commands/convert.ts)_ ## `asyncapi diff OLD NEW` @@ -289,7 +289,7 @@ DESCRIPTION Find diff between two asyncapi files ``` -_See code: [src/commands/diff.ts](https://github.com/asyncapi/cli/blob/v0.51.2/src/commands/diff.ts)_ +_See code: [src/commands/diff.ts](https://github.com/asyncapi/cli/blob/v0.51.3/src/commands/diff.ts)_ ## `asyncapi generate` @@ -303,7 +303,7 @@ DESCRIPTION Generate typed models or other things like clients, applications or docs using AsyncAPI Generator templates. ``` -_See code: [src/commands/generate/index.ts](https://github.com/asyncapi/cli/blob/v0.51.2/src/commands/generate/index.ts)_ +_See code: [src/commands/generate/index.ts](https://github.com/asyncapi/cli/blob/v0.51.3/src/commands/generate/index.ts)_ ## `asyncapi generate fromTemplate ASYNCAPI TEMPLATE` @@ -432,7 +432,7 @@ DESCRIPTION Creates a new asyncapi file ``` -_See code: [src/commands/new/index.ts](https://github.com/asyncapi/cli/blob/v0.51.2/src/commands/new/index.ts)_ +_See code: [src/commands/new/index.ts](https://github.com/asyncapi/cli/blob/v0.51.3/src/commands/new/index.ts)_ ## `asyncapi new file` @@ -520,7 +520,7 @@ EXAMPLES $ asyncapi optimize ./asyncapi.yaml --optimization=remove-components,reuse-components,move-to-components --output=terminal --no-tty ``` -_See code: [src/commands/optimize.ts](https://github.com/asyncapi/cli/blob/v0.51.2/src/commands/optimize.ts)_ +_See code: [src/commands/optimize.ts](https://github.com/asyncapi/cli/blob/v0.51.3/src/commands/optimize.ts)_ ## `asyncapi start` @@ -534,7 +534,7 @@ DESCRIPTION Start asyncapi studio ``` -_See code: [src/commands/start/index.ts](https://github.com/asyncapi/cli/blob/v0.51.2/src/commands/start/index.ts)_ +_See code: [src/commands/start/index.ts](https://github.com/asyncapi/cli/blob/v0.51.3/src/commands/start/index.ts)_ ## `asyncapi start studio` @@ -578,5 +578,5 @@ DESCRIPTION validate asyncapi file ``` -_See code: [src/commands/validate.ts](https://github.com/asyncapi/cli/blob/v0.51.2/src/commands/validate.ts)_ +_See code: [src/commands/validate.ts](https://github.com/asyncapi/cli/blob/v0.51.3/src/commands/validate.ts)_ From 4d92a680be8c530ea624c02370893754e95d5883 Mon Sep 17 00:00:00 2001 From: Aadrika Bhargava <64789514+reachaadrika@users.noreply.github.com> Date: Tue, 1 Aug 2023 02:02:09 +0530 Subject: [PATCH 17/23] feat: adding unit tests for editor component (#1885) Co-authored-by: Akshat Nema <76521428+akshatnema@users.noreply.github.com> --- components/editor/CodeBlock.js | 4 ++-- cypress/test/editor/CodeBlock.cy.js | 30 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 cypress/test/editor/CodeBlock.cy.js diff --git a/components/editor/CodeBlock.js b/components/editor/CodeBlock.js index b0e19db2234..974c2285c52 100644 --- a/components/editor/CodeBlock.js +++ b/components/editor/CodeBlock.js @@ -104,8 +104,8 @@ export default function CodeBlock({ { showCopy && (
-
diff --git a/cypress/test/editor/CodeBlock.cy.js b/cypress/test/editor/CodeBlock.cy.js new file mode 100644 index 00000000000..825960baead --- /dev/null +++ b/cypress/test/editor/CodeBlock.cy.js @@ -0,0 +1,30 @@ +import { mount } from 'cypress/react' +import CodeBlock from '../../../components/editor/CodeBlock' + +describe('CodeBlock component', () => { + beforeEach(() => { + mount( + + { `const message = 'Hello, World!';\nconsole.log(message);` } + + ) + }); + + it('should render correctly', () => { + cy.get('.bg-code-editor-dark').should('exist') + + }) + it('should copy code to clipboard when clicking the copy button', () => { + const copiedText = "const message = 'Hello, World!';\r\nconsole.log(message);" + + cy.get('[data-test="copy-button"]').click({force:true}) + cy.get('[data-testid="clicked-text"]').should('exist'); + + cy.window().then((win) => { + cy.document().then((doc) => { + cy.wrap(win.navigator.clipboard.readText()).should('eq', copiedText) + }) + }) + }) + +}) From c175f86aedca6157999ddd93b300a005a2086272 Mon Sep 17 00:00:00 2001 From: Aadrika Bhargava <64789514+reachaadrika@users.noreply.github.com> Date: Tue, 1 Aug 2023 02:10:59 +0530 Subject: [PATCH 18/23] feat: add unit tests for newsroom-videos scripts (#1988) Co-authored-by: akshatnema <20bcs022@iiitdmj.ac.in>%0ACo-authored-by: Akshat Nema <76521428+akshatnema@users.noreply.github.com>%0ACo-authored-by: akshatnema --- cypress/test/mockData/mockData.json | 18 +++++++ .../test/scripts/build-newsroom-videos.cy.js | 51 +++++++++++++++++++ scripts/build-newsroom-videos.js | 38 +++++++------- 3 files changed, 90 insertions(+), 17 deletions(-) create mode 100644 cypress/test/mockData/mockData.json create mode 100644 cypress/test/scripts/build-newsroom-videos.cy.js diff --git a/cypress/test/mockData/mockData.json b/cypress/test/mockData/mockData.json new file mode 100644 index 00000000000..139b01fde36 --- /dev/null +++ b/cypress/test/mockData/mockData.json @@ -0,0 +1,18 @@ +{ + "items": [ + { + "summary": "Event 1", + "start": { + "dateTime": "2023-07-23T10:00:00Z" + }, + "htmlLink": "https://www.example.com/event1" + }, + { + "summary": "Event 2", + "start": { + "dateTime": "2023-07-24T15:30:00Z" + }, + "htmlLink": "https://www.example.com/event2" + } + ] +} \ No newline at end of file diff --git a/cypress/test/scripts/build-newsroom-videos.cy.js b/cypress/test/scripts/build-newsroom-videos.cy.js new file mode 100644 index 00000000000..34ceab2af87 --- /dev/null +++ b/cypress/test/scripts/build-newsroom-videos.cy.js @@ -0,0 +1,51 @@ +import { buildNewsroomVideos } from '../../../scripts/build-newsroom-videos'; + +describe('Newsroom Videos', () => { + // eslint-disable-next-line cypress/no-async-tests + it('fetches and saves newsroom videos', async () => { + // Define the data that the API should return (stubbed response) + const stubbedResponse = { + items: [ + { + snippet: { + thumbnails: { + high: { + url: 'https://example.com/image.jpg', + }, + }, + title: 'Test Video 1', + description: 'This is a test video 1', + }, + id: { + videoId: 'videoId1', + }, + }, + { + snippet: { + thumbnails: { + high: { + url: 'https://example.com/image2.jpg', + }, + }, + title: 'Test Video 2', + description: 'This is a test video 2', + }, + id: { + videoId: 'videoId2', + }, + }, + ], + }; + + // Intercept the API request and stub the response + cy.intercept('GET', 'https://youtube.googleapis.com/youtube/v3/search*', { + statusCode: 200, + body: stubbedResponse, + }).as('getYoutubeVideos'); + + // Manually trigger the function + await buildNewsroomVideos().then((videoData) => { + expect(videoData).to.exist; + }); + }); +}); \ No newline at end of file diff --git a/scripts/build-newsroom-videos.js b/scripts/build-newsroom-videos.js index 99bb7ddcef7..2b4b4dac4cf 100644 --- a/scripts/build-newsroom-videos.js +++ b/scripts/build-newsroom-videos.js @@ -1,24 +1,23 @@ const { writeFileSync } = require('fs'); const { resolve } = require('path'); const fetch = require('node-fetch') +export async function buildNewsroomVideos() { -async function buildNewsroomVideos () { - - try{ + try { let data; const response = await fetch('https://youtube.googleapis.com/youtube/v3/search?' + new URLSearchParams({ - key: process.env.YOUTUBE_TOKEN, - part: 'snippet', - channelId: 'UCIz9zGwDLbrYQcDKVXdOstQ', - eventType: 'completed', - type:'video', - order: 'Date', - maxResults: 5, + key: process.env.YOUTUBE_TOKEN, + part: 'snippet', + channelId: 'UCIz9zGwDLbrYQcDKVXdOstQ', + eventType: 'completed', + type: 'video', + order: 'Date', + maxResults: 5, })) data = await response.json() - const videoDataItems = data.items.map((video) =>{ + const videoDataItems = data.items.map((video) => { return { - image_url:video.snippet.thumbnails.high.url, + image_url: video.snippet.thumbnails.high.url, title: video.snippet.title, description: video.snippet.description, videoId: video.id.videoId, @@ -27,11 +26,16 @@ async function buildNewsroomVideos () { const videoData = JSON.stringify(videoDataItems, null, ' '); console.log('The following are the Newsroom Youtube videos: ', videoData) - writeFileSync( - resolve(__dirname, '../config', 'newsroom_videos.json'), - videoData - ); - }catch(err){ + try { + writeFileSync( + resolve(__dirname, '../config', 'newsroom_videos.json'), + videoData + ); + } catch (err) { + console.error(err); + } + return videoData; + } catch (err) { console.log(err) } } From ead403f105e83dcbcd2a9507846f58600a8b2dff Mon Sep 17 00:00:00 2001 From: asyncapi-bot Date: Tue, 1 Aug 2023 09:27:40 +0200 Subject: [PATCH 19/23] docs(cli): update latest cli documentation (#2015) --- pages/docs/tools/cli/usage.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pages/docs/tools/cli/usage.md b/pages/docs/tools/cli/usage.md index 01f6093db8d..a9bb8e105f6 100644 --- a/pages/docs/tools/cli/usage.md +++ b/pages/docs/tools/cli/usage.md @@ -29,7 +29,7 @@ $ npm install -g @asyncapi/cli $ asyncapi COMMAND running command... $ asyncapi (--version) -@asyncapi/cli/0.51.3 linux-x64 node-v18.17.0 +@asyncapi/cli/0.51.5 linux-x64 node-v18.17.0 $ asyncapi --help [COMMAND] USAGE $ asyncapi COMMAND @@ -91,7 +91,7 @@ EXAMPLES $ asyncapi bundle ./asyncapi.yaml ./features.yaml --base ./asyncapi.yaml --reference-into-components ``` -_See code: [src/commands/bundle.ts](https://github.com/asyncapi/cli/blob/v0.51.3/src/commands/bundle.ts)_ +_See code: [src/commands/bundle.ts](https://github.com/asyncapi/cli/blob/v0.51.5/src/commands/bundle.ts)_ ## `asyncapi config` @@ -105,7 +105,7 @@ DESCRIPTION CLI config settings ``` -_See code: [src/commands/config/index.ts](https://github.com/asyncapi/cli/blob/v0.51.3/src/commands/config/index.ts)_ +_See code: [src/commands/config/index.ts](https://github.com/asyncapi/cli/blob/v0.51.5/src/commands/config/index.ts)_ ## `asyncapi config context` @@ -234,7 +234,7 @@ DESCRIPTION Convert asyncapi documents older to newer versions ``` -_See code: [src/commands/convert.ts](https://github.com/asyncapi/cli/blob/v0.51.3/src/commands/convert.ts)_ +_See code: [src/commands/convert.ts](https://github.com/asyncapi/cli/blob/v0.51.5/src/commands/convert.ts)_ ## `asyncapi diff OLD NEW` @@ -289,7 +289,7 @@ DESCRIPTION Find diff between two asyncapi files ``` -_See code: [src/commands/diff.ts](https://github.com/asyncapi/cli/blob/v0.51.3/src/commands/diff.ts)_ +_See code: [src/commands/diff.ts](https://github.com/asyncapi/cli/blob/v0.51.5/src/commands/diff.ts)_ ## `asyncapi generate` @@ -303,7 +303,7 @@ DESCRIPTION Generate typed models or other things like clients, applications or docs using AsyncAPI Generator templates. ``` -_See code: [src/commands/generate/index.ts](https://github.com/asyncapi/cli/blob/v0.51.3/src/commands/generate/index.ts)_ +_See code: [src/commands/generate/index.ts](https://github.com/asyncapi/cli/blob/v0.51.5/src/commands/generate/index.ts)_ ## `asyncapi generate fromTemplate ASYNCAPI TEMPLATE` @@ -432,7 +432,7 @@ DESCRIPTION Creates a new asyncapi file ``` -_See code: [src/commands/new/index.ts](https://github.com/asyncapi/cli/blob/v0.51.3/src/commands/new/index.ts)_ +_See code: [src/commands/new/index.ts](https://github.com/asyncapi/cli/blob/v0.51.5/src/commands/new/index.ts)_ ## `asyncapi new file` @@ -520,7 +520,7 @@ EXAMPLES $ asyncapi optimize ./asyncapi.yaml --optimization=remove-components,reuse-components,move-to-components --output=terminal --no-tty ``` -_See code: [src/commands/optimize.ts](https://github.com/asyncapi/cli/blob/v0.51.3/src/commands/optimize.ts)_ +_See code: [src/commands/optimize.ts](https://github.com/asyncapi/cli/blob/v0.51.5/src/commands/optimize.ts)_ ## `asyncapi start` @@ -534,7 +534,7 @@ DESCRIPTION Start asyncapi studio ``` -_See code: [src/commands/start/index.ts](https://github.com/asyncapi/cli/blob/v0.51.3/src/commands/start/index.ts)_ +_See code: [src/commands/start/index.ts](https://github.com/asyncapi/cli/blob/v0.51.5/src/commands/start/index.ts)_ ## `asyncapi start studio` @@ -578,5 +578,5 @@ DESCRIPTION validate asyncapi file ``` -_See code: [src/commands/validate.ts](https://github.com/asyncapi/cli/blob/v0.51.3/src/commands/validate.ts)_ +_See code: [src/commands/validate.ts](https://github.com/asyncapi/cli/blob/v0.51.5/src/commands/validate.ts)_ From 80ba410363edec963082e33df4fa4855ee2362bc Mon Sep 17 00:00:00 2001 From: asyncapi-bot Date: Tue, 1 Aug 2023 10:16:05 +0200 Subject: [PATCH 20/23] docs(cli): update latest cli documentation (#2016) --- pages/docs/tools/cli/usage.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pages/docs/tools/cli/usage.md b/pages/docs/tools/cli/usage.md index a9bb8e105f6..90d7e4962aa 100644 --- a/pages/docs/tools/cli/usage.md +++ b/pages/docs/tools/cli/usage.md @@ -29,7 +29,7 @@ $ npm install -g @asyncapi/cli $ asyncapi COMMAND running command... $ asyncapi (--version) -@asyncapi/cli/0.51.5 linux-x64 node-v18.17.0 +@asyncapi/cli/0.51.6 linux-x64 node-v18.17.0 $ asyncapi --help [COMMAND] USAGE $ asyncapi COMMAND @@ -91,7 +91,7 @@ EXAMPLES $ asyncapi bundle ./asyncapi.yaml ./features.yaml --base ./asyncapi.yaml --reference-into-components ``` -_See code: [src/commands/bundle.ts](https://github.com/asyncapi/cli/blob/v0.51.5/src/commands/bundle.ts)_ +_See code: [src/commands/bundle.ts](https://github.com/asyncapi/cli/blob/v0.51.6/src/commands/bundle.ts)_ ## `asyncapi config` @@ -105,7 +105,7 @@ DESCRIPTION CLI config settings ``` -_See code: [src/commands/config/index.ts](https://github.com/asyncapi/cli/blob/v0.51.5/src/commands/config/index.ts)_ +_See code: [src/commands/config/index.ts](https://github.com/asyncapi/cli/blob/v0.51.6/src/commands/config/index.ts)_ ## `asyncapi config context` @@ -234,7 +234,7 @@ DESCRIPTION Convert asyncapi documents older to newer versions ``` -_See code: [src/commands/convert.ts](https://github.com/asyncapi/cli/blob/v0.51.5/src/commands/convert.ts)_ +_See code: [src/commands/convert.ts](https://github.com/asyncapi/cli/blob/v0.51.6/src/commands/convert.ts)_ ## `asyncapi diff OLD NEW` @@ -289,7 +289,7 @@ DESCRIPTION Find diff between two asyncapi files ``` -_See code: [src/commands/diff.ts](https://github.com/asyncapi/cli/blob/v0.51.5/src/commands/diff.ts)_ +_See code: [src/commands/diff.ts](https://github.com/asyncapi/cli/blob/v0.51.6/src/commands/diff.ts)_ ## `asyncapi generate` @@ -303,7 +303,7 @@ DESCRIPTION Generate typed models or other things like clients, applications or docs using AsyncAPI Generator templates. ``` -_See code: [src/commands/generate/index.ts](https://github.com/asyncapi/cli/blob/v0.51.5/src/commands/generate/index.ts)_ +_See code: [src/commands/generate/index.ts](https://github.com/asyncapi/cli/blob/v0.51.6/src/commands/generate/index.ts)_ ## `asyncapi generate fromTemplate ASYNCAPI TEMPLATE` @@ -432,7 +432,7 @@ DESCRIPTION Creates a new asyncapi file ``` -_See code: [src/commands/new/index.ts](https://github.com/asyncapi/cli/blob/v0.51.5/src/commands/new/index.ts)_ +_See code: [src/commands/new/index.ts](https://github.com/asyncapi/cli/blob/v0.51.6/src/commands/new/index.ts)_ ## `asyncapi new file` @@ -520,7 +520,7 @@ EXAMPLES $ asyncapi optimize ./asyncapi.yaml --optimization=remove-components,reuse-components,move-to-components --output=terminal --no-tty ``` -_See code: [src/commands/optimize.ts](https://github.com/asyncapi/cli/blob/v0.51.5/src/commands/optimize.ts)_ +_See code: [src/commands/optimize.ts](https://github.com/asyncapi/cli/blob/v0.51.6/src/commands/optimize.ts)_ ## `asyncapi start` @@ -534,7 +534,7 @@ DESCRIPTION Start asyncapi studio ``` -_See code: [src/commands/start/index.ts](https://github.com/asyncapi/cli/blob/v0.51.5/src/commands/start/index.ts)_ +_See code: [src/commands/start/index.ts](https://github.com/asyncapi/cli/blob/v0.51.6/src/commands/start/index.ts)_ ## `asyncapi start studio` @@ -578,5 +578,5 @@ DESCRIPTION validate asyncapi file ``` -_See code: [src/commands/validate.ts](https://github.com/asyncapi/cli/blob/v0.51.5/src/commands/validate.ts)_ +_See code: [src/commands/validate.ts](https://github.com/asyncapi/cli/blob/v0.51.6/src/commands/validate.ts)_ From c5b57b3f2d5374270264d18b02c1b4957741d1e1 Mon Sep 17 00:00:00 2001 From: Aadrika Bhargava <64789514+reachaadrika@users.noreply.github.com> Date: Tue, 1 Aug 2023 22:30:29 +0530 Subject: [PATCH 21/23] feat: add integration tests for dashboard component & community pages (#1953) Co-authored-by: akshatnema <20bcs022@iiitdmj.ac.in>%0ACo-authored-by: akshatnema --- components/community/Card.js | 8 +- components/navigation/EventFilter.js | 4 +- components/navigation/EventPostItem.js | 2 +- cypress/fixtures/eventsData.json | 239 ++++++++++++++++++ cypress/test/community/Card.cy.js | 2 + .../test/dashboard/GoodFirstIssuesTip.cy.js | 8 +- cypress/test/dashboard/Header.cy.js | 5 +- .../pages/community/ambassadors/index.cy.js | 78 ++++++ cypress/test/pages/community/dashboard.cy.js | 28 ++ .../test/pages/community/events/index.cy.js | 70 +++++ cypress/test/pages/community/index.cy.js | 68 +++++ cypress/test/pages/community/newsroom.cy.js | 13 + cypress/test/pages/community/tsc.cy.js | 58 +++++ cypress/utils/MockApp.js | 33 +++ cypress/utils/router.js | 7 +- pages/community/ambassadors/index.js | 33 +-- pages/community/events/index.js | 26 +- pages/community/index.js | 23 +- pages/community/tsc.js | 26 +- 19 files changed, 661 insertions(+), 70 deletions(-) create mode 100644 cypress/fixtures/eventsData.json create mode 100644 cypress/test/pages/community/ambassadors/index.cy.js create mode 100644 cypress/test/pages/community/dashboard.cy.js create mode 100644 cypress/test/pages/community/events/index.cy.js create mode 100644 cypress/test/pages/community/index.cy.js create mode 100644 cypress/test/pages/community/newsroom.cy.js create mode 100644 cypress/test/pages/community/tsc.cy.js create mode 100644 cypress/utils/MockApp.js diff --git a/components/community/Card.js b/components/community/Card.js index b5be16046b9..ee743c45c87 100644 --- a/components/community/Card.js +++ b/components/community/Card.js @@ -11,7 +11,7 @@ export default function SmallHomeCards({icon, tagline, taglineBg, type="large",
+ data-testid="Card-small-bg">
{icon} {tagline}
@@ -41,10 +41,10 @@ export default function SmallHomeCards({icon, tagline, taglineBg, type="large", className={`h-140 w-full shadow-xl rounded p-6 border ${ !bg && 'border-[#ad20e2]' } ${bg}`} - > + data-testid="Card-lg-bg">
+ data-testid="Card-lg-tagline"> {icon} {tagline}
@@ -62,7 +62,7 @@ export default function SmallHomeCards({icon, tagline, taglineBg, type="large",
- +
{' '} {btnText} diff --git a/components/navigation/EventFilter.js b/components/navigation/EventFilter.js index c801fb4a5ce..2ddce66b18e 100644 --- a/components/navigation/EventFilter.js +++ b/components/navigation/EventFilter.js @@ -29,9 +29,9 @@ function EventFilter({ data, setData }) { } }, [active]); return ( -
+
{filterList.map((list) => ( -
+
  • { cy.get('[data-testid="Card-desc"]').contains('Description').should('exist'); cy.get('[data-testid="Card-heading"]').should('have.class','mt-3'); cy.get('[data-testid="Card-desc"]').should('have.class','mt-2'); + cy.get('[href="/path"]').should('exist'); }); it('renders large card correctly', () => { @@ -46,6 +47,7 @@ describe('SmallHomeCards', () => { // Testing for large prop classes and styles cy.get('[data-testid="Card-heading-lg"]').contains('Heading').should('exist'); cy.get('[data-testid="Card-desc-lg"]').contains('Description').should('exist'); + cy.get('[href="/path"]').should('exist'); cy.get('[data-testid="Card-heading-lg"]').should('have.class','mt-10'); cy.get('[data-testid="Card-desc-lg"]').should('have.class','mt-6'); diff --git a/cypress/test/dashboard/GoodFirstIssuesTip.cy.js b/cypress/test/dashboard/GoodFirstIssuesTip.cy.js index 67f7f7b8862..5cca9d74e7a 100644 --- a/cypress/test/dashboard/GoodFirstIssuesTip.cy.js +++ b/cypress/test/dashboard/GoodFirstIssuesTip.cy.js @@ -8,14 +8,12 @@ describe('GoodFirstIssuesTip', () => { }); it('toggles the tip when hovering over the icon', () => { - cy.get('[data-testid="GoodFirstIssuesTip-hover-icon"]').trigger('mouseenter'); - cy.get('[data-testid="GoodFirstIssuesTip-hover-icon"]').trigger('mouseleave'); - + cy.get('[data-testid="GoodFirstIssuesTip-hover-icon"]').click({ force: true }); }); it('renders the tip content with the correct text', () => { - cy.get('[data-testid="GoodFirstIssuesTip-hover-icon"]').trigger('mouseenter'); - //checking for the available class here + cy.get('[data-testid="GoodFirstIssuesTip-hover-icon"]').click({ force: true }); + //checking for the available class here cy.get('.bg-white').should('have.css', 'visibility', 'visible'); cy.contains('Is this your first contribution?').should('exist'); diff --git a/cypress/test/dashboard/Header.cy.js b/cypress/test/dashboard/Header.cy.js index 6de218040db..9bccdae248e 100644 --- a/cypress/test/dashboard/Header.cy.js +++ b/cypress/test/dashboard/Header.cy.js @@ -22,10 +22,11 @@ describe('Header', () => { 'contain', 'Visualize our progress. Get involved.' ); - cy.get('[data-testid="Github-button"]').should('exist'); - cy.get('[data-testid="Slack-button"]').should('exist'); + cy.contains('Contribution Guide') .should('have.attr', 'href', 'https://github.com/asyncapi?type=source#-contribute-to-asyncapi') .should('have.attr', 'target', '_blank'); + cy.get('[data-testid="Button-link"]').should('exist'); + cy.get('[data-testid="Button-link"]').should('exist'); }); }); diff --git a/cypress/test/pages/community/ambassadors/index.cy.js b/cypress/test/pages/community/ambassadors/index.cy.js new file mode 100644 index 00000000000..f4818f13851 --- /dev/null +++ b/cypress/test/pages/community/ambassadors/index.cy.js @@ -0,0 +1,78 @@ +import MockApp from "../../../../utils/MockApp" +import Index from '../../../../../pages/community/ambassadors/index' +import ambassadorList from '../../../../../config/ambassador_lists.json' +import ambassadors from '../../../../../config/AMBASSADORS_MEMBERS.json' +import { addAdditionalUserInfo } from "../../../../../pages/community/ambassadors/index"; +import { sortBy } from 'lodash'; + +describe('Test for Ambassadors', () => { + beforeEach(() => { + cy.mount() + }); + + it('displays the main Ambassadors section ', () => { + cy.get('[data-testid="Ambassadors-main"]').should('exist') + cy.get('[data-testid="Ambassadors-content"]').should('exist') + cy.get('[data-testid="Ambassadors-button"]').should('exist') + cy.get(`[href="https://github.com/asyncapi/community/blob/master/AMBASSADOR_ORGANIZATION.md#are-you-interested-in-becoming-an-official-asyncapi-ambassador"]`).should('exist'); + cy.get('[data-testid="Ambassadors-Iframe"]').should('exist') + cy.get('[data-testid="Ambassadors-contributions"]').should('exist') + }); + + it('renders the ambassador list with correct data', () => { + ambassadorList.contents.forEach((link) => { + cy.get('[data-testid="Ambassadors-list"]') + .find(`img[alt="${link.title}"]`) + .should('exist') + .and('have.attr', 'src', link.icon); + + cy.get('[data-testid="Ambassadors-list"]') + .contains('h2', link.title) + .should('exist'); + + cy.get('[data-testid="Ambassadors-list"]') + .contains('p', link.details) + .should('exist'); + }); + }); + + it('renders the ambassadors with correct data', () => { + const asyncapiAmbassadors = sortBy( + ambassadors.map((user) => addAdditionalUserInfo(user)), + ['name'] + ); + cy.get('[data-testid="Ambassadors-members-main"]') + .children() + .should('have.length', asyncapiAmbassadors.length); + + asyncapiAmbassadors.forEach((ambassador) => { + cy.get('[data-testid="Ambassadors-members-details"]') + .contains('div', ambassador.name) + + cy.get('[data-testid="Ambassadors-members-img"]') + .find(`img[alt="${ambassador.name}"]`) + .should('have.attr', 'src', ambassador.img); + + cy.get('[data-testid="Ambassadors-members"]') + .contains('div', ambassador.title); + }); + }); + + it('displays the Tokens of our appreciation section with correct data', () => { + cy.get('[data-testid="Events-token"]').should('exist') + + ambassadorList.tokens.forEach((token) => { + cy.contains('.mt-20 li', token.emoji).should('exist'); + cy.contains('.mt-20 li', token.title).should('exist'); + cy.contains('.mt-20 li', token.details).should('exist'); + }); + }); + + it('displays the Become an AsyncAPI Ambassador section with correct data', () => { + cy.get('[data-testid="Events-ambassadors"]').should('exist'); + }); + + it('should display NewsletterSubscribe', () => { + cy.get('[data-testid="NewsletterSubscribe-main"]').should('exist'); + }); +}); \ No newline at end of file diff --git a/cypress/test/pages/community/dashboard.cy.js b/cypress/test/pages/community/dashboard.cy.js new file mode 100644 index 00000000000..da33c1cc006 --- /dev/null +++ b/cypress/test/pages/community/dashboard.cy.js @@ -0,0 +1,28 @@ +import MockApp from "../../../utils/MockApp"; +import DashboardHome from "../../../../pages/community/dashboard"; +import Header from "../../../../components/dashboard/Header"; +import { mount } from '@cypress/react' +describe('Integration Test for Dashboard ', () => { + + it('should filter GoodFirstIssues and check dashboard render ', () => { + mount( + + + + ); + // Click on the first filter option + cy.get(Header).should('exist') + cy.contains('AsyncAPI - Dashboard') + cy.get('[data-testid="Filters-img-container"]').click({ force: true }); + cy.get('[data-testid="Filter-menu"]').within(() => { + cy.get('[data-testid="Select-form"]').eq(0).select('asyncapi/generator', { force: true }); + cy.get('[data-testid="Select-form"]').eq(1).select('docs') + }); + //check if selected is only displayed + cy.contains('asyncapi/generator'); + cy.contains('docs') + //check if this is not selected options are not displayed + cy.should('not.contain', 'asyncapi/community'); + cy.should('not.contain', 'javascript'); + }); +}); \ No newline at end of file diff --git a/cypress/test/pages/community/events/index.cy.js b/cypress/test/pages/community/events/index.cy.js new file mode 100644 index 00000000000..6713bb8d471 --- /dev/null +++ b/cypress/test/pages/community/events/index.cy.js @@ -0,0 +1,70 @@ +import Eventindex from "../../../../../pages/community/events"; +import MockApp from "../../../../utils/MockApp"; +import meetings from '../../../../../config/meetings.json'; +import moment from 'moment'; +describe('CommunityIndexPage', () => { + beforeEach(() => { + cy.mount() + }); + + it('displays the basic Events', () => { + cy.get('[data-testid="Events-main"]').should('exist') + cy.contains('Join an AsyncAPI event from anywhere in the world.') + cy.get('[data-testid="Events-Button"]').should('exist') + cy.get(`[href="https://calendar.google.com/calendar/u/3?cid=Y19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bncm91cC5jYWxlbmRhci5nb29nbGUuY29t"]`).should('exist'); + cy.get(`[href="https://calendar.google.com/calendar/ical/c_q9tseiglomdsj6njuhvbpts11c%40group.calendar.google.com/public/basic.ics"]`).should('exist'); + cy.get('[data-testid="TextLink-href" ]').should('have.attr', 'href', 'https://github.com/asyncapi/community/blob/master/MEETINGS_ORGANIZATION.md') + }); + + it('displays recording card', () => { + cy.get('[data-testid="RecordingsCard-img"]').should('exist'); + cy.get('[data-testid="Recordings-Link"]').should('have.attr', 'href', 'https://www.youtube.com/playlist?list=PLbi1gRlP7pijRiA32SU36hD_FW-2qyPhl') + cy.get('[data-testid="Recordings-text"]').should('exist'); + }); + + it('check for Events Filters', () => { + cy.get('[data-testid="EventFilters-main"]').should('exist'); + cy.get('[data-testid="EventFilter-click"]').contains('All').click({ force: true }); + + meetings.forEach((event) => { + cy.contains(event.title).should('be.visible'); + }); + cy.get('[data-testid="EventFilter-click"]').contains('Upcoming').click({ force: true }); + + const currentDate = moment().format('YYYY-MM-DD'); + meetings.forEach((event) => { + if (moment(event.date).isAfter(currentDate)) { + cy.contains(event.title).should('be.visible'); + } + }); + + cy.get('[data-testid="EventFilter-click"]').contains('Recorded').click({ force: true }); + const currentDate1 = moment().format('YYYY-MM-DD'); + meetings.forEach((event) => { + if (moment(event.date).isBefore(currentDate1)) { + cy.contains(event.title).should('be.visible'); + } + }); + }) + + it('check for Events Post Item', () => { + cy.get('[data-testid="EventPostItem-main"]').should('exist'); + }) + + it('Community Meeting Card', () => { + cy.get('[data-testid="EventTypesCard"]').should('exist') + cy.get('[data-testid="Meeting-heading"]').should('exist') + cy.get('[ data-testid="Meeting-paragraph"]').should('exist') + cy.get('[ data-testid="Meeting-host"]').should('exist') + cy.get('[ data-testid="Meeting-link"]').should('exist') + }); + + + it('Other Meeting Cards', () => { + cy.get('[data-testid="EventTypesCard-others"]').should('exist') + cy.get('[data-testid="Meeting-heading"]').should('exist') + cy.get('[ data-testid="Meeting-paragraph"]').should('exist') + cy.get('[ data-testid="Meeting-host"]').should('exist') + cy.get('[ data-testid="Meeting-link"]').should('exist') + }); +}); \ No newline at end of file diff --git a/cypress/test/pages/community/index.cy.js b/cypress/test/pages/community/index.cy.js new file mode 100644 index 00000000000..7eb0b28b3ff --- /dev/null +++ b/cypress/test/pages/community/index.cy.js @@ -0,0 +1,68 @@ +import MockApp from "../../../utils/MockApp"; +import CommunityIndexPage from "../../../../pages/community"; + +describe('CommunityIndexPage', () => { + beforeEach(() => { + cy.mount() + }); + + it('displays the page title & check for first Community Home Card', () => { + cy.contains('AsyncAPI Community Meetings'); + cy.get('[data-testid="CommunityIndex-HomeCard"]').should('exist') + cy.get('[data-testid="HomeCard-main"]').contains('Thanking our AsyncAPI Ambassadors') + cy.get('[data-testid="HomeCard-title"]').contains('Ambassador Programs') + cy.get(`[href="/community/ambassadors"]`).should('exist'); + cy.get('[data-testid="HomeCard-button"]').should('exist'); + cy.get(".bg-ambassador").should('exist') + }); + + it('checks for CommunityIndex Display Card', () => { + cy.get('[data-testid="CommunityIndex-IssuesCard"]').should('exist') + cy.get('[data-testid="Card-lg-bg"]').should('have.class', 'bg-code-editor-dark') + cy.get('[data-testid="Card-lg-tagline"]').should('have.class', 'bg-pink-100') + cy.get('[data-testid="Card-heading-lg"]').should('exist'); + cy.get('[data-testid="Card-desc-lg"]').should('exist'); + cy.get(`[href="/community/dashboard"]`).should('exist'); + }); + + it('should display the Newsroom Card', () => { + cy.get('[data-testid="CommunityIndex-Newsroom-Card"]').should('exist'); + cy.get('[data-testid="Card-lg-bg"]').should('have.class', 'bg-code-editor-dark'); + cy.get('[data-testid="Card-lg-tagline"]').should('have.class', 'bg-pink-100'); + cy.get('[data-testid="Card-heading-lg"]').should('exist'); + cy.get('[data-testid="Card-desc-lg"]').should('exist'); + cy.get('[href="/community/newsroom"]').should('exist'); + }); + + it('should display the Toolings Card', () => { + cy.get('[data-testid="CommunityIndex-Toolings-Card"]').should('exist'); + cy.get('[data-testid="Card-lg-tagline"]').should('exist') + cy.get('[data-testid="Card-heading-lg"]').should('exist') + cy.get('[data-testid="Card-desc-lg"]').should('exist') + cy.get('[href="/tools"]').should('exist'); + }); + + it('should display other cards correctly', () => { + cy.get('[data-testid="CommunityCards-Goals"]').should('exist'); + cy.get('[href="https://github.com/asyncapi/community/discussions/513"]').should('exist'); + cy.get('[data-testid="CommunityCards-Contributors"]').should('exist'); + cy.get('[href="https://github.com/orgs/asyncapi/discussions/593"]').should('exist'); + cy.get('[data-testid="CommunityCards-TSC"]').should('exist'); + cy.get('[href="/community/tsc"]').should('exist'); + }); + + it('should display slack card ', () => { + cy.get('[data-testid="CommunityCards-Slack"]').should('exist'); + cy.get('[data-testid="CommunityIndex-HomeCard"]').should('exist') + cy.get('[data-testid="HomeCard-main"]').contains('All community info, tracked') + cy.get('[data-testid="HomeCard-title"]').contains('AsyncAPI Slack') + cy.get(`[href="https://asyncapi.com/slack-invite"]`).should('exist'); + cy.get('[data-testid="HomeCard-button"]').should('exist'); + cy.get(".bg-channelCover").should('exist') + }); + + it('should display NewsletterSubscribe', () => { + cy.get('[data-testid="CommunityCard-subscribe"]').should('exist'); + cy.get('[data-testid="NewsletterSubscribe-main"]').should('exist'); + }); +}); \ No newline at end of file diff --git a/cypress/test/pages/community/newsroom.cy.js b/cypress/test/pages/community/newsroom.cy.js new file mode 100644 index 00000000000..b3b11e3ea5f --- /dev/null +++ b/cypress/test/pages/community/newsroom.cy.js @@ -0,0 +1,13 @@ +import MockApp from "../../../utils/MockApp"; +import { mount } from "@cypress/react"; +import NewsroomSection from '../../../../pages/community/newsroom' + +describe('Test for Newsroom Section Pages', () => { + it('renders correctly', () => { + mount( + + + + ); + }); +}); \ No newline at end of file diff --git a/cypress/test/pages/community/tsc.cy.js b/cypress/test/pages/community/tsc.cy.js new file mode 100644 index 00000000000..8b1bcdfb2df --- /dev/null +++ b/cypress/test/pages/community/tsc.cy.js @@ -0,0 +1,58 @@ +import MockApp from "../../../utils/MockApp"; +import TSC from '../../../../pages/community/tsc' + +describe('TSC', () => { + beforeEach(() => { + cy.mount() + }); + + it('displays basic TSC ', () => { + cy.get('[data-testid="TSC-content"]').should('exist'); + cy.get(`[href="https://github.com/asyncapi/community/blob/master/TSC_MEMBERSHIP.md"]`).should('exist'); + cy.get('[data-testid="TSC-Governance-Link"]').should('have.attr', 'href', 'https://github.com/asyncapi/community/blob/master/CHARTER.md') + cy.get('[data-testid="TSC-Article-Link"]').should('have.attr', 'href', 'https://www.asyncapi.com/blog/governance-motivation') + cy.get('[data-testid="NewsletterSubscribe-main"]').should('exist') + }); + + it("should display TSC members", () => { + // Check if the "Current TSC members" section is visible + cy.contains("Current TSC members").should("be.visible"); + + // Check if each TSC member card contains the required information + cy.get('[data-testid="UserInfo-list"]').each((member) => { + cy.wrap(member).within(() => { + // Check if the user's name and avatar are visible + cy.get('[data-testid="UserInfo-avatar"]').should("be.visible"); + cy.get('[data-testid="UserInfo-name"]').should("be.visible"); + + // Check if the user's work status is visible + cy.get('[data-testid="status-element"]').should("be.visible"); + + // Check if the social links are visible + cy.get('[data-testid="Social-Links"]').should("have.length.gt", 0); + cy.get('[data-testid="Repo-Links"]').should("have.length.gt", 0); + }); + }); + + }); + + it("should have valid social links", () => { + // Check if each TSC member card's social links are valid + cy.get('[data-testid="UserInfo-list"]').each((member) => { + cy.wrap(member).within(() => { + cy.get('[data-testid="Social-Links"]').each((socialLink) => { + cy.wrap(socialLink) + .should("have.attr", "href") + .and("match", /^(https?:\/\/)/); + }); + }); + }); + }); + + it('displays Question Card ', () => { + cy.get('[data-testid="Question-card"]').should('exist'); + cy.get('[data-testid="Question-card-img"]').should('exist'); + cy.get(`[href="https://github.com/asyncapi/community/blob/master/TSC_MEMBERSHIP.md"]`).should('exist'); + }); +}); + diff --git a/cypress/utils/MockApp.js b/cypress/utils/MockApp.js new file mode 100644 index 00000000000..31558164c39 --- /dev/null +++ b/cypress/utils/MockApp.js @@ -0,0 +1,33 @@ +/** + * This file is use to mock the root "_app.js" , so that cypress could directly access refs , contexts and scripts present + * in the "Head" tags , thus by wrapping up pages into MockApp we enable to cypress to access routes , and can mount the + * required pages easily. + */ + +import AppContext from "../../context/AppContext"; +import { MDXProvider } from "../../components/MDX"; +import Layout from "../../components/layout/Layout"; +import AlgoliaSearch from "../../components/AlgoliaSearch"; +import { createRouter } from "./router"; +import MockRouter from "./router"; + +import Head from "next/head"; + +export default function MockApp({ children }) { + return ( + + + + + + +
    + + {children} + +
    +
    +
    +
    + ) +} \ No newline at end of file diff --git a/cypress/utils/router.js b/cypress/utils/router.js index a02a93219b5..f77ae5e4003 100644 --- a/cypress/utils/router.js +++ b/cypress/utils/router.js @@ -1,7 +1,12 @@ +/** + * This file is use to mock the useRouter hook from next.js which is not available otherwise in cypress and enables + * cypress to access router properties like asPath and links. + */ + import React from 'react'; import { RouterContext } from 'next/dist/shared/lib/router-context'; -const createRouter = (params) => ({ +export const createRouter = (params) => ({ route: '/', pathname: '/', query: {}, diff --git a/pages/community/ambassadors/index.js b/pages/community/ambassadors/index.js index a68f9cbd5e6..f8e5f358322 100644 --- a/pages/community/ambassadors/index.js +++ b/pages/community/ambassadors/index.js @@ -9,7 +9,7 @@ import ambassadorList from '../../../config/ambassador_lists.json' import Link from 'next/link'; -function addAdditionalUserInfo(user) { +export function addAdditionalUserInfo(user) { const userData = { ...user, }; @@ -43,9 +43,9 @@ function Index() { image={image} wide > -
    -
    -

    +
    +
    +

    Teachers. Champions.{' '} Ambassadors!

    @@ -58,7 +58,7 @@ function Index() { Become an AsyncAPI Ambassador and help the OSS community build the future of APIs. -
    +
    -
    +
    AsyncAPI Ambassador Contributions @@ -102,6 +102,7 @@ function Index() {
  • Learn and share knowledge with community members -
    +
    {asyncapiAmbassadors.map((ambassador, i) => (
    + data-testid="Ambassadors-members" + >
    -
    +
    {ambassador.name}
    -
    {ambassador.country}
    +
    {ambassador.country}
    -
    +
    {ambassador.name}
    {ambassador.bio}
    -
    +
    Twitter ↗ @@ -191,7 +194,7 @@ function Index() {
    -
    +
    Tokens of our appreciation
    -
    +
    diff --git a/pages/community/events/index.js b/pages/community/events/index.js index f6d372db1cd..c1f46e167af 100644 --- a/pages/community/events/index.js +++ b/pages/community/events/index.js @@ -1,6 +1,5 @@ /* eslint-disable react/no-unescaped-entities */ import React, { useState } from 'react'; -import moment from 'moment'; import GoogleCalendarButton from '../../../components/buttons/GoogleCalendarButton'; import ICSFileButton from '../../../components/buttons/ICSFileButton'; import Heading from '../../../components/typography/Heading'; @@ -12,13 +11,10 @@ import Meeting from '../../../components/Meeting'; import NewsletterSubscribe from '../../../components/NewsletterSubscribe'; import TextLink from '../../../components/typography/TextLink'; import meetings from '../../../config/meetings.json'; -import AnnouncementHero from '../../../components/campaigns/AnnoucementHero'; - - import Paragraph from '../../../components/typography/Paragraph'; import { getEvents } from '../../../lib/staticHelpers'; -function index() { +function Eventindex() { const image = '/img/social/community-events.webp'; const [events, setEvents] = useState(getEvents(meetings)); @@ -29,13 +25,13 @@ function index() { image={image} wide > -
    +
    -

    +

    Join an AsyncAPI event from anywhere in the world.

    -
    +
    - conf-logo -
    - Watch now + Watch now
    @@ -120,7 +116,7 @@ function index() {
    -
    +
    Event Types @@ -130,7 +126,7 @@ function index() {
    -
    +
    -
    +
    -
    +
    -
    +
    -
    -
    +
    +
    -
    +
    -
    +
    -
    +
    -
    +
    -
    +
    -
    +
    -
    +
    diff --git a/pages/community/tsc.js b/pages/community/tsc.js index c42f53b6588..6d2b0c4c72b 100644 --- a/pages/community/tsc.js +++ b/pages/community/tsc.js @@ -51,7 +51,7 @@ export default function TSC() { wide >
  • -
    -
    -
    {user.name}
    +
    {user.name}