diff --git a/.all-contributorsrc b/.all-contributorsrc index 8f3a49ee524f..c1c76d9cdfe0 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -61,10 +61,10 @@ ] }, { - "login": "alequetzalli", - "name": "Alejandra Quetzalli ", + "login": "quetzalliwrites", + "name": "Quetzalli Writes", "avatar_url": "https://avatars.githubusercontent.com/u/19964402?v=4", - "profile": "https://github.com/alequetzalli", + "profile": "https://github.com/quetzalliwrites", "contributions": [ "doc", "review", diff --git a/README.md b/README.md index 5d6eab484fea..5f153826f3c7 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,7 @@ After cloning repository to your local, perform the following steps from the roo #### Steps: 1. Build the Docker image: ```bash - docker build -t asyncapi-website .` + docker build -t asyncapi-website . ``` 2. Start the container: ```bash @@ -336,7 +336,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Fran Méndez
Fran Méndez

💻 📖 🐛 🎨 🚧 🚇 🤔 👀 📝 Lukasz Gornicki
Lukasz Gornicki

💻 📖 🐛 🎨 🚧 🚇 🤔 👀 📝 Maciej Urbańczyk
Maciej Urbańczyk

💻 📖 🐛 🎨 🚧 🚇 🤔 👀 📝 - Alejandra Quetzalli
Alejandra Quetzalli

📖 👀 📢 + Quetzalli Writes
Quetzalli Writes

📖 👀 📢 Aayush Kumar Sahu
Aayush Kumar Sahu

💻 🐛 🎨 David Boyne
David Boyne

💻 🎨 Jesse Menning
Jesse Menning

📝 diff --git a/assets/docs/fragments/contribution-notes.md b/assets/docs/fragments/contribution-notes.md index 5c10d80c480f..64f0015e4d89 100644 --- a/assets/docs/fragments/contribution-notes.md +++ b/assets/docs/fragments/contribution-notes.md @@ -11,4 +11,4 @@ To get started as a Docs contributor: Do you have a documentation contributor question and you're wondering how to tag me into a GitHub discussion or PR? Never fear! -Tag me in your AsyncAPI Doc PRs or [GitHub Discussions](https://github.com/asyncapi/community/discussions/categories/docs) via my GitHub handle, [`alequetzalli`](https://github.com/alequetzalli) 🐙. +Tag me in your AsyncAPI Doc PRs or [GitHub Discussions](https://github.com/asyncapi/community/discussions/categories/docs) via my GitHub handle, [`quetzalliwrites`](https://github.com/quetzalliwrites) 🐙. diff --git a/config/all-tags.json b/config/all-tags.json index b8274f82abbd..b2a1c6f3c3ac 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":"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":"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":"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":"HTML","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Java","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}]} \ No newline at end of file diff --git a/config/meetings.json b/config/meetings.json index a6db3de6e5be..3b20641c3cd9 100644 --- a/config/meetings.json +++ b/config/meetings.json @@ -1,11 +1,4 @@ [ - { - "title": "Essential Building Blocks Working Group", - "calLink": "https://www.google.com/calendar/event?eid=c28zazMxcDk3MThpMWFpNG9lYzRrbmIzNW8gY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", - "url": "https://github.com/asyncapi/community/issues/1342", - "banner": "", - "date": "2024-08-27T18:00:00.000Z" - }, { "title": "Marketing WG Meeting", "calLink": "https://www.google.com/calendar/event?eid=MmpwdGxqb29wcHQyaGk3dXU1cTJ0M3E2aGMgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", diff --git a/config/newsroom_videos.json b/config/newsroom_videos.json index 004af39ff3b3..5d5a467bb308 100644 --- a/config/newsroom_videos.json +++ b/config/newsroom_videos.json @@ -1,4 +1,10 @@ [ + { + "image_url": "https://i.ytimg.com/vi/QWRcCvDmf04/hqdefault.jpg", + "title": "AsyncAPI Mentorship Program 2024 Cohort Kick-off", + "description": "Welcoming the 2024 cohort of the AsyncAPI mentorship program.", + "videoId": "QWRcCvDmf04" + }, { "image_url": "https://i.ytimg.com/vi/XirMXiBNaBM/hqdefault.jpg", "title": "Community Meeting, 16:00 UTC Tuesday November 26th 2024", @@ -22,11 +28,5 @@ "title": "The Many Meanings Of An AsyncAPI File - Swen-Helge Huber", "description": "", "videoId": "Q1q6JoFG0zM" - }, - { - "image_url": "https://i.ytimg.com/vi/lCTdXmougTk/hqdefault.jpg", - "title": "AsyncAPI and DDD - A Pretty Couple - Dr. Annegret Junker", - "description": "", - "videoId": "lCTdXmougTk" } ] \ No newline at end of file diff --git a/config/orbitData.json b/config/orbitData.json index 8f5e11acd061..6d0c2aa26296 100644 --- a/config/orbitData.json +++ b/config/orbitData.json @@ -7,8 +7,8 @@ }, { "id": "item", - "img": "/img/homepage/ale.webp", - "alt": "ale" + "img": "/img/homepage/que.webp", + "alt": "que" }, { "id": "item", diff --git a/config/tools-automated.json b/config/tools-automated.json index 20f6621b8fe2..0537545cebda 100644 --- a/config/tools-automated.json +++ b/config/tools-automated.json @@ -139,6 +139,27 @@ "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 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": "TypeScript", + "technology": [ + "React JS", + "Docker" + ], + "categories": [ + "code-generator" + ], + "hasCommercial": false, + "isAsyncAPIOwner": true + } + }, { "title": "ZenWave SDK", "description": "DDD and API-First for Event-Driven Microservices", @@ -179,27 +200,6 @@ "hasCommercial": false, "isAsyncAPIOwner": false } - }, - { - "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": "TypeScript", - "technology": [ - "React JS", - "Docker" - ], - "categories": [ - "code-generator" - ], - "hasCommercial": false, - "isAsyncAPIOwner": true - } } ] }, @@ -404,34 +404,34 @@ } }, { - "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!", + "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/cli" + "repoUrl": "https://github.com/asyncapi/github-action-for-cli" }, "filters": { "technology": [ - "AsyncAPI Generator" + "AsyncAPI CLI" ], "categories": [ - "github-actions" + "github-action" ], "hasCommercial": false, "isAsyncAPIOwner": true } }, { - "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": "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/github-action-for-cli" + "repoUrl": "https://github.com/asyncapi/cli" }, "filters": { "technology": [ - "AsyncAPI CLI" + "AsyncAPI Generator" ], "categories": [ - "github-action" + "github-actions" ], "hasCommercial": 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,15 +718,18 @@ "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.", + "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" @@ -736,17 +739,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" @@ -756,15 +761,15 @@ } }, { - "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.", + "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/nodejs-template" + "repoUrl": "https://github.com/asyncapi/html-template" }, "filters": { "language": "javascript", "technology": [ - "Node.js" + "HTML" ], "categories": [ "generator-template" @@ -774,18 +779,15 @@ } }, { - "title": "Java Spring Cloud Stream Template", - "description": "Java Spring Cloud Stream template for the AsyncAPI Generator", + "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/java-spring-cloud-stream-template" + "repoUrl": "https://github.com/asyncapi/nodejs-template" }, "filters": { - "language": [ - "javascript" - ], + "language": "javascript", "technology": [ - "Spring Cloud Streams", - "Maven" + "Node.js" ], "categories": [ "generator-template" @@ -795,19 +797,15 @@ } }, { - "title": "Java Spring Template", - "description": "Java Spring template for the AsyncAPI Generator", + "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/java-spring-template" + "repoUrl": "https://github.com/asyncapi/nodejs-ws-template" }, "filters": { - "language": [ - "javascript" - ], + "language": "javascript", "technology": [ - "Springboot", - "Maven", - "Gradle" + "Node.js" ], "categories": [ "generator-template" @@ -817,15 +815,17 @@ } }, { - "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.", + "title": "Java Template", + "description": "Java template for the AsyncAPI Generator", "links": { - "repoUrl": "https://github.com/asyncapi/nodejs-ws-template" + "repoUrl": "https://github.com/asyncapi/java-template" }, "filters": { - "language": "javascript", + "language": [ + "javascript" + ], "technology": [ - "Node.js" + "Java" ], "categories": [ "generator-template" diff --git a/dashboard.json b/dashboard.json index 467af3c1924b..8ecaa6a03cd6 100644 --- a/dashboard.json +++ b/dashboard.json @@ -1,24 +1,31 @@ { "hotDiscussions": [ { - "id": "I_kwDODou01c5BZZv-", + "id": "I_kwDOFLhIt84-OUI3", "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": "Create educational & technical video explaining AsyncAPI's main features", + "author": "quetzalliwrites", + "resourcePath": "/asyncapi/community/issues/155", + "repo": "asyncapi/community", "labels": [ { "name": "enhancement", "color": "a2eeef" - }, - { - "name": "keep-open", - "color": "f9dd4b" } ], - "score": 31.302030173669205 + "score": 34.46095064991105 + }, + { + "id": "PR_kwDOBW5R_c5-T7mG", + "isPR": true, + "isAssigned": false, + "title": "feat: add tests for build post list script", + "author": "vishvamsinh28", + "resourcePath": "/asyncapi/website/pull/3284", + "repo": "asyncapi/website", + "labels": [], + "score": 29.866157229922912 }, { "id": "I_kwDOGQYLdM5AX1lK", @@ -38,18 +45,18 @@ "color": "0E8A16" } ], - "score": 27.8559351086781 + "score": 28.717458874925875 }, { - "id": "PR_kwDOBW5R_c5-T7mG", + "id": "PR_kwDOBW5R_c6BZLuT", "isPR": true, "isAssigned": false, - "title": "feat: add tests for build post list script", + "title": "feat: add tests for check markdown script", "author": "vishvamsinh28", - "resourcePath": "/asyncapi/website/pull/3284", + "resourcePath": "/asyncapi/website/pull/3378", "repo": "asyncapi/website", "labels": [], - "score": 25.845712987433288 + "score": 23.26114168868996 }, { "id": "PR_kwDOFLhIt85bqKL8", @@ -105,17 +112,6 @@ "labels": [], "score": 20.102221212448114 }, - { - "id": "PR_kwDOFLhIt85oVQqh", - "isPR": true, - "isAssigned": false, - "title": "feat: docs automation for website", - "author": "AnimeshKumar923", - "resourcePath": "/asyncapi/community/pull/1082", - "repo": "asyncapi/community", - "labels": [], - "score": 18.666348268701817 - }, { "id": "I_kwDOBW5R_c5RVOOY", "isPR": false, @@ -136,38 +132,6 @@ ], "score": 17.517649913704783 }, - { - "id": "PR_kwDOBW5R_c535wDj", - "isPR": true, - "isAssigned": false, - "title": "feat: add test for combine tools script", - "author": "vishvamsinh28", - "resourcePath": "/asyncapi/website/pull/3136", - "repo": "asyncapi/website", - "labels": [ - { - "name": "gsoc", - "color": "F4D03F" - } - ], - "score": 16.65612614745701 - }, - { - "id": "I_kwDOFLhIt84-OUI3", - "isPR": false, - "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": 16.60974586154023 - }, { "id": "PR_kwDOFLhIt853IEwA", "isPR": true, @@ -188,37 +152,96 @@ "resourcePath": "/asyncapi/community/issues/568", "repo": "asyncapi/community", "labels": [], - "score": 15.507427792459973 + "score": 15.794602381209232 + }, + { + "id": "I_kwDODou01c5BZZv-", + "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", + "labels": [ + { + "name": "enhancement", + "color": "a2eeef" + }, + { + "name": "keep-open", + "color": "f9dd4b" + } + ], + "score": 15.087185824232376 + }, + { + "id": "I_kwDODou01c5ZAFWh", + "isPR": false, + "isAssigned": true, + "title": "Please support File References", + "author": "philCryoport", + "resourcePath": "/asyncapi/studio/issues/528", + "repo": "asyncapi/studio", + "labels": [ + { + "name": "enhancement", + "color": "a2eeef" + }, + { + "name": "bounty", + "color": "0E8A16" + } + ], + "score": 14.07155484871368 } ], "goodFirstIssues": [ { - "id": "I_kwDODwv8N86f37o-", - "title": "Return to top arrow feature/button", + "id": "I_kwDOFLhIt86ihL5I", + "title": "[BUG] voting summary has some errors in `isVotedInLast3Months`", "isAssigned": false, - "resourcePath": "/asyncapi/conference-website/issues/475", - "repo": "asyncapi/conference-website", - "author": "thulieblack", - "area": "Unknown", + "resourcePath": "/asyncapi/community/issues/1614", + "repo": "asyncapi/community", + "author": "derberg", + "area": "javascript", "labels": [ { - "name": "enhancement", - "color": "a2eeef" + "name": "bug", + "color": "d73a4a" } ] }, { - "id": "I_kwDOFLhIt86dkhlL", - "title": "Design for mentors for promotion", - "isAssigned": false, - "resourcePath": "/asyncapi/community/issues/1582", + "id": "I_kwDOFLhIt86hMsxx", + "title": "Create an announcement design for the new TSC member (Ashmit Jagtap)", + "isAssigned": true, + "resourcePath": "/asyncapi/community/issues/1602", "repo": "asyncapi/community", "author": "iambami", - "area": "design", + "area": "Unknown", "labels": [ { "name": ":loudspeaker: marketing", "color": "a829e2" + }, + { + "name": "🎨 design", + "color": "0D67D3" + } + ] + }, + { + "id": "I_kwDODwv8N86f37o-", + "title": "Return to top arrow feature/button", + "isAssigned": false, + "resourcePath": "/asyncapi/conference-website/issues/475", + "repo": "asyncapi/conference-website", + "author": "thulieblack", + "area": "Unknown", + "labels": [ + { + "name": "enhancement", + "color": "a2eeef" } ] }, @@ -396,21 +419,6 @@ "area": "design", "labels": [] }, - { - "id": "I_kwDOBW5R_c6U79Xr", - "title": "[Docs Bug 🐞 report]: Github handle link of alequetzalli is not working ", - "isAssigned": false, - "resourcePath": "/asyncapi/website/issues/3176", - "repo": "asyncapi/website", - "author": "NoIdea2001", - "area": "Unknown", - "labels": [ - { - "name": "🐞 docs bug", - "color": "FFD23F" - } - ] - }, { "id": "I_kwDOFLhIt86O7jFN", "title": "[DESIGN] Holopin Design Tracking", @@ -479,7 +487,12 @@ "repo": "asyncapi/cli", "author": "Amzani", "area": "typescript", - "labels": [] + "labels": [ + { + "name": "stale", + "color": "ededed" + } + ] }, { "id": "I_kwDOCHlHJM58YMi8", @@ -496,25 +509,6 @@ } ] }, - { - "id": "I_kwDOE8Qh3857Kllp", - "title": "Add loading animation for when playground generate models ", - "isAssigned": false, - "resourcePath": "/asyncapi/modelina/issues/1725", - "repo": "asyncapi/modelina", - "author": "jonaslagoni", - "area": "Unknown", - "labels": [ - { - "name": "enhancement", - "color": "a2eeef" - }, - { - "name": "website", - "color": "57A793" - } - ] - }, { "id": "I_kwDODyzcIc54mr9C", "title": "Fix wrong format for Co-authored automerged commits + pagination", @@ -633,6 +627,10 @@ { "name": "enhancement", "color": "a2eeef" + }, + { + "name": "stale", + "color": "ededed" } ] }, @@ -689,21 +687,6 @@ } ] }, - { - "id": "I_kwDOBGu-185qGt6A", - "title": "Ensure consistency when using either `Application` or `API` terms", - "isAssigned": false, - "resourcePath": "/asyncapi/spec/issues/949", - "repo": "asyncapi/spec", - "author": "smoya", - "area": "Unknown", - "labels": [ - { - "name": "enhancement", - "color": "a2eeef" - } - ] - }, { "id": "I_kwDOE8Qh385m4AtC", "title": "C# generator add xml docs from the async api description", @@ -975,6 +958,10 @@ { "name": "enhancement", "color": "a2eeef" + }, + { + "name": "stale", + "color": "ededed" } ] } diff --git a/markdown/blog/2022Q1-summary.md b/markdown/blog/2022Q1-summary.md index 800fafb39ea3..7d4393219071 100644 --- a/markdown/blog/2022Q1-summary.md +++ b/markdown/blog/2022Q1-summary.md @@ -120,10 +120,10 @@ Success with OpenForce was followed by the unexpected announcement that AsyncAPI }} /> -An amazing success for [Alejandra Quetzalli](https://twitter.com/QuetzalliAle) and an excellent opportunity for the AsyncAPI Initiative to improve its documentation big time! -On May 16, we will announce the names of six interns we want to hire to work on two different projects to have better docs. Alejandra leads a super challenging task to interview as many candidates as possible (around 150!). Keep your fingers crossed. +An amazing success for [Quetzalli Writes][quetzalliwrites-xcom] and an excellent opportunity for the AsyncAPI Initiative to improve its documentation big time! +On May 16, we will announce the names of six interns we want to hire to work on two different projects to have better docs. Quetzalli leads a super challenging task to interview as many candidates as possible (around 150!). Keep your fingers crossed. -Alejandra and I will be mentors for our GSoD interns in the following months. Stay tuned to watch the progress. +Quetzalli and I will be mentors for our GSoD interns in the following months. Stay tuned to watch the progress. ### AsyncAPI Mentorship @@ -147,7 +147,7 @@ One of our missions is to have kick-ass documentation. Easy, right? Writing docs is easy, just like writing code (at least in my opinion :stuck_out_tongue_winking_eye:). Well, we all know the devil is hidden in details. Details like gathering requirements, figuring out architecture, and making sure you have a well-motivated group of people working on it. And last but not least, make sure the community can easily share feedback on your work transparently. -I wrote already about [Alejandra Quetzalli](https://twitter.com/QuetzalliAle) and the efforts to get AsyncAPI into GSoD. Getting a well-motivated group of people to work on docs, checked. :white_check_mark: +I wrote already about [Quetzalli Writes][quetzalliwrites-xcom] and the efforts to get AsyncAPI into GSoD. Getting a well-motivated group of people to work on docs, checked. :white_check_mark: Our [new docs information architecture is almost here too](https://github.com/asyncapi/website/pull/601). I think we can say "checked" :white_check_mark: to this one too. @@ -164,11 +164,14 @@ Since this week, we can also say "checked" :white_check_mark: to the idea of **g Each documentation page has a dedicated feedback form that one can fill in anonymously. The form injects the feedback into a [docs-related GitHub Discussion like this example](https://github.com/asyncapi/community/discussions/340). Huge applause to: -- [Alejandra Quetzalli](https://twitter.com/QuetzalliAle) for leading the change +- [Quetzalli Writes][quetzalliwrites-xcom] for leading the change - [Missy Turco](https://twitter.com/missyturco) for amazing support with design - [Maciej Urbanczyk](https://github.com/magicmatatjahu) for detailed review - [Akshat Nema](https://twitter.com/AksNema) for implementation. Akshat demonstrated a lot of patience here. As an individual contributor, he waited for the merge for quite some time. There was a long discussion, many parties involved. Many contributors lost interest in such long-running PRs. Not Akshat! :muscle: -Anyway, I recommend you follow [Alejandra](https://twitter.com/QuetzalliAle) and her [regular docs-related updates](https://gist.github.com/alequetzalli). +Anyway, I recommend you follow [Quetzalli][quetzalliwrites-xcom] and her [regular docs-related updates][quetzalliwrites-gist]. > Photo by Mitchell Luo on Unsplash + +- [quetzalliwrites-xcom]: https://x.com/quetzalliwrites +- [quetzalliwrites-gist]: https://gist.github.com/quetzalliwrites \ No newline at end of file diff --git a/markdown/blog/2023-April-docs-report.md b/markdown/blog/2023-April-docs-report.md index 3a8feb36e68e..74c321547e5a 100644 --- a/markdown/blog/2023-April-docs-report.md +++ b/markdown/blog/2023-April-docs-report.md @@ -7,9 +7,9 @@ tags: - Communication cover: /img/posts/2023-april-docs-report.webp authors: - - name: Alejandra Quetzalli - photo: /img/avatars/canela-ale.webp - link: https://www.linkedin.com/in/alejandra-quetzalli/ + - name: Quetzalli Writes + photo: /img/avatars/canela-quetzalli.webp + link: https://www.linkedin.com/in/quetzalli-writes/ byline: In April 2023, the AsyncAPI documentation experienced significant growth with 8,889 sessions and 4,575 unique users, including 2,895 new users. --- @@ -23,21 +23,21 @@ In April 2023, the AsyncAPI documentation experienced significant growth with ** We are thrilled to introduce this year's selected technical writing candidates for the 2023 Google Season of Docs (GSoD) at AsyncAPI! ### 2023 GSoD Accepted Technical Writer Candidates -Alejandra Quetzalli has chosen four outstanding candidates to collaborate with us for GSoD this year: [Mahfuza](https://github.com/mhmohona), [Bhaswati](https://github.com/BhaswatiRoy), [Rohit](https://github.com/TRohit20), and [Hridyesh](https://github.com/kakabisht). +Quetzalli Writes has chosen four outstanding candidates to collaborate with us for GSoD this year: [Mahfuza](https://github.com/mhmohona), [Bhaswati](https://github.com/BhaswatiRoy), [Rohit](https://github.com/TRohit20), and [Hridyesh](https://github.com/kakabisht). ### Overview of the LIVE Writing/Editing Interviews -During the LIVE interview session, Alejandra divided the exercises into two parts: writing and editing. Candidates were given a document and asked to identify issues and potential solutions, then rewrite or edit the document as needed. Some candidates faced challenges with staying focused on writing, while others struggled to generate ideas due to nerves or the live format of the exercise. A few candidates had difficulty spotting errors and completing the editing task. +During the LIVE interview session, Quetzalli divided the exercises into two parts: writing and editing. Candidates were given a document and asked to identify issues and potential solutions, then rewrite or edit the document as needed. Some candidates faced challenges with staying focused on writing, while others struggled to generate ideas due to nerves or the live format of the exercise. A few candidates had difficulty spotting errors and completing the editing task. -However, Alejandra did not disqualify candidates who experienced nerves, writer's block, or had limited editing skills. Instead, she guided them with questions and suggestions, encouraging them to search for answers online during the call. The main objective was to evaluate the candidates' problem-solving skills, ability to accept feedback, and integrate suggestions for improvement. The following sections outline the writing and editing exercises and the selection criteria for the candidates. +However, Quetzalli did not disqualify candidates who experienced nerves, writer's block, or had limited editing skills. Instead, she guided them with questions and suggestions, encouraging them to search for answers online during the call. The main objective was to evaluate the candidates' problem-solving skills, ability to accept feedback, and integrate suggestions for improvement. The following sections outline the writing and editing exercises and the selection criteria for the candidates. #### The Writing Part -For the writing exercise, Alejandra utilized [an old commit from the 2022 GSoD project](https://github.com/asyncapi/website/pull/1025/commits/1f1fe7dc643434d8ab24a877ee4e2af38a0f330b), which contained numerous errors for candidates to identify and fix. Some examples of these errors include: +For the writing exercise, Quetzalli utilized [an old commit from the 2022 GSoD project](https://github.com/asyncapi/website/pull/1025/commits/1f1fe7dc643434d8ab24a877ee4e2af38a0f330b), which contained numerous errors for candidates to identify and fix. Some examples of these errors include: - Multiple preview deployment links instead of live links to actual documentation. - Content more appropriate for the `Background context` section crammed into the `Introduction`. - Inadequate tutorial steps that lacked sufficient technical background context for first-time users. #### The Editing Part -For the editing exercise, Alejandra used the same [old commit from the 2022 GSoD project](https://github.com/asyncapi/website/pull/1025/commits/1f1fe7dc643434d8ab24a877ee4e2af38a0f330b) for some candidates. For those who progressed further during the writing exercise, she provided a second block of content to edit that was unformatted and contained repeated mistakes. The purpose of this unformatted text was to assess the candidates' ability to: +For the editing exercise, Quetzalli used the same [old commit from the 2022 GSoD project](https://github.com/asyncapi/website/pull/1025/commits/1f1fe7dc643434d8ab24a877ee4e2af38a0f330b) for some candidates. For those who progressed further during the writing exercise, she provided a second block of content to edit that was unformatted and contained repeated mistakes. The purpose of this unformatted text was to assess the candidates' ability to: - Research terms like CLI, Node.js, macOS, etc., instead of assuming they know the correct spelling. - Use the `replace all` keyboard shortcut to fix repeated mistakes. - Think to check and confirm the correct spelling of AsyncAPI during an AsyncAPI interview. @@ -55,7 +55,7 @@ The following factors were considered when assessing candidates: ## Spec 3.0 Release AsyncAPI community members, including Jonas Lagoni and Sergio Moya, have started the process of identifying Spec 3.0 Subject Matter Experts (SMEs) who can provide the necessary background context for our technical writers to begin updating our documentation. -While Alejandra and Sergio are currently the only ones sharing the Spec 3.0 **writing work**, we're actively seeking more contributors to join their writing efforts. +While Quetzalli and Sergio are currently the only ones sharing the Spec 3.0 **writing work**, we're actively seeking more contributors to join their writing efforts. The following Spec 3.0 release changes require documentation updates: - [Request/reply](https://github.com/asyncapi/spec/pull/847) diff --git a/markdown/blog/2023-Q1-docs-report.md b/markdown/blog/2023-Q1-docs-report.md index 1c90d29c37ed..ed550e01b600 100644 --- a/markdown/blog/2023-Q1-docs-report.md +++ b/markdown/blog/2023-Q1-docs-report.md @@ -7,9 +7,9 @@ tags: - Communication cover: /img/posts/Q1-asyncapidocs-report.webp authors: - - name: Alejandra Quetzalli - photo: /img/avatars/canela-ale.webp - link: https://www.linkedin.com/in/alejandra-quetzalli/ + - name: Quetzalli Writes + photo: /img/avatars/canela-quetzalli.webp + link: https://www.linkedin.com/in/quetzalli-writes/ byline: During Q1 2023, AsyncAPI Docs had 26,875 sessions and 13,506 unique users! excerpt: Did you know that you can contribute Docs to AsyncAPI as well? Code isn't the only way to contribute to OSS; Dev Docs are a huge help that benefit the entire OSS ecosystem. --- @@ -89,9 +89,9 @@ style N fill:#T3EFB8,stroke:#000000,stroke-width:2px; - $350 for participant swag+shipping costs ### GSoD technical writer applications are open -Alejandra Quetzalli is currently accepting applications for technical writers who want to participate in GSoD 2023 at AsyncAPI. **The deadline for applications is April 15.** Interested participants must complete this [AsyncAPI GSoD 2023 written application available in a public Google form](https://forms.gle/Lb4ELK78R1WY2z9MA). We have received 18 applications to date. +Quetzalli Writes is currently accepting applications for technical writers who want to participate in GSoD 2023 at AsyncAPI. **The deadline for applications is April 15.** Interested participants must complete this [AsyncAPI GSoD 2023 written application available in a public Google form](https://forms.gle/Lb4ELK78R1WY2z9MA). We have received 18 applications to date. -If selected, the next step in the process for candidates will be to receive a direct follow-up message (DM) on AsyncAPI Slack and an email from Alejandra to schedule a LIVE editing and writing exercise interview. Up to 6 technical writers will be selected no later than April 21st. +If selected, the next step in the process for candidates will be to receive a direct follow-up message (DM) on AsyncAPI Slack and an email from Quetzalli to schedule a LIVE editing and writing exercise interview. Up to 6 technical writers will be selected no later than April 21st. ```mermaid graph TD diff --git a/markdown/blog/2023-Q4-docs-report.md b/markdown/blog/2023-Q4-docs-report.md index 8baaf02d3c04..b3c4ec8c7398 100644 --- a/markdown/blog/2023-Q4-docs-report.md +++ b/markdown/blog/2023-Q4-docs-report.md @@ -7,9 +7,9 @@ tags: - Communication cover: /img/posts/2023-Q4-docs-report/Q4-docs-diagram-summary.webp authors: - - name: Alejandra Quetzalli - photo: /img/avatars/canela-ale.webp - link: https://www.linkedin.com/in/alejandra-quetzalli/ + - name: Quetzalli Writes + photo: /img/avatars/canela-quetzalli.webp + link: https://www.linkedin.com/in/quetzalli-writes/ byline: During Q4 2023, AsyncAPI Docs had a total of 19,267 sessions and 6,447 unique users. excerpt: In Q4, AsyncAPI docs had primary engagement across the tutorials and reference content buckets. --- @@ -18,7 +18,7 @@ import ContributionNotes from '@/assets/docs/fragments/contribution-notes.md'; import TalkToMe from '@/assets/docs/fragments/talk-to-me.md'; # AsyncAPI Documentation Report - Q4 2023 -As a core maintainer of AsyncAPI Docs, I (Alejandra Quetzalli) volunteer to write periodic updates about the AsyncAPI Docs ecosystem. The goal is to keep the community informed about what's going on in docs and how docs contributors collaborate with other areas in AsyncAPI Initiative. +As a core maintainer of AsyncAPI Docs, I (Quetzalli Writes) volunteer to write periodic updates about the AsyncAPI Docs ecosystem. The goal is to keep the community informed about what's going on in docs and how docs contributors collaborate with other areas in AsyncAPI Initiative. ## Overview During Q4 2023, AsyncAPI Docs had a total of **19,267 sessions** and **6,447 unique users**. diff --git a/markdown/blog/2023-july-docs-report.md b/markdown/blog/2023-july-docs-report.md index 867d3359c466..3f0e8ffb8573 100644 --- a/markdown/blog/2023-july-docs-report.md +++ b/markdown/blog/2023-july-docs-report.md @@ -7,9 +7,9 @@ tags: - Communication cover: /img/posts/2023-july-docs-report.webp authors: - - name: Alejandra Quetzalli - photo: /img/avatars/canela-ale.webp - link: https://www.linkedin.com/in/alejandra-quetzalli/ + - name: Quetzalli Writes + photo: /img/avatars/canela-quetzalli.webp + link: https://www.linkedin.com/in/quetzalli-writes/ byline: In July 2023, the AsyncAPI documentation had 7,443 sessions and 3,895 unique users, including 2,345 new users. --- diff --git a/markdown/blog/2023-june-docs-report.md b/markdown/blog/2023-june-docs-report.md index 604548186a21..d9ddc6b76455 100644 --- a/markdown/blog/2023-june-docs-report.md +++ b/markdown/blog/2023-june-docs-report.md @@ -7,9 +7,9 @@ tags: - Communication cover: /img/posts/2023-june-docs-report.webp authors: - - name: Alejandra Quetzalli - photo: /img/avatars/canela-ale.webp - link: https://www.linkedin.com/in/alejandra-quetzalli/ + - name: Quetzalli Writes + photo: /img/avatars/canela-quetzalli.webp + link: https://www.linkedin.com/in/quetzalli-writes/ byline: In June 2023, the AsyncAPI documentation had 7,827 sessions and 4,203 unique users, including 2,566 new users. --- diff --git a/markdown/blog/2023-may-docs-report.md b/markdown/blog/2023-may-docs-report.md index 2b21c61b1f64..d2c73afe3e03 100644 --- a/markdown/blog/2023-may-docs-report.md +++ b/markdown/blog/2023-may-docs-report.md @@ -7,9 +7,9 @@ tags: - Communication cover: /img/posts/2023-may-docs-report.webp authors: - - name: Alejandra Quetzalli - photo: /img/avatars/canela-ale.webp - link: https://www.linkedin.com/in/alejandra-quetzalli/ + - name: Quetzalli Writes + photo: /img/avatars/canela-quetzalli.webp + link: https://www.linkedin.com/in/quetzalli-writes/ byline: In May 2023, the AsyncAPI documentation had 9,453 sessions and 4,876 unique users, including 2,895 new users. --- diff --git a/markdown/blog/2024-Q1-docs-report.md b/markdown/blog/2024-Q1-docs-report.md index 3f5950eeedae..abac050f3e07 100644 --- a/markdown/blog/2024-Q1-docs-report.md +++ b/markdown/blog/2024-Q1-docs-report.md @@ -7,15 +7,15 @@ tags: - Communication cover: /img/posts/2024-Q1-docs-report/2024-Q1-docs-report.webp authors: - - name: Alejandra Quetzalli - photo: /img/avatars/canela-ale.webp - link: https://www.linkedin.com/in/alejandra-quetzalli/ + - name: Quetzalli Writes + photo: /img/avatars/canela-quetzalli.webp + link: https://www.linkedin.com/in/quetzalli-writes/ byline: During Q1 2024, AsyncAPI docs had a total of 26,923 sessions and 8,128 unique users. excerpt: During Q1 2024, AsyncAPI docs had a total of 26,923 sessions and 8,128 unique users. --- # AsyncAPI Documentation Report - Q1 2024 -As a core maintainer of AsyncAPI Docs, I (Alejandra Quetzalli) volunteer to write periodic updates about the AsyncAPI Docs ecosystem. The goal is to keep the community informed about what's going on in docs and how docs contributors collaborate with other areas in AsyncAPI Initiative. +As a core maintainer of AsyncAPI Docs, I (Quetzalli Writes) volunteer to write periodic updates about the AsyncAPI Docs ecosystem. The goal is to keep the community informed about what's going on in docs and how docs contributors collaborate with other areas in AsyncAPI Initiative. ## Overview During Q1 2024, AsyncAPI Docs had a total of **26,923 sessions** and **8,128 unique users**. Our tutorials content bucket garnered the highest visitor count, indicating strong engagement. Additionally, our newer content bucket for migrations attracted a notable influx of new users, showcasing promising growth. diff --git a/markdown/blog/2024-february-summary.md b/markdown/blog/2024-february-summary.md index 2ee2a4026f5d..7bf7ba79e025 100644 --- a/markdown/blog/2024-february-summary.md +++ b/markdown/blog/2024-february-summary.md @@ -13,7 +13,7 @@ authors: excerpt: 'Community update for February' --- -We are starting the year off with a bang as we got accepted to the [Google Summer of Code 2024](https://summerofcode.withgoogle.com/programs/2024/organizations/asyncapi) program after two years of rejections. It is an incredible achievement for the community, and we wouldn't have done it without our Doc's Lead, [Alejandra Quetzalli](https://www.linkedin.com/in/alejandra-quetzalli/), who crafted an excellent proposal, and [Elegbede Azeez](https://twitter.com/_acebuild). We are very excited to have received this opportunity, and you can read [the AsyncAPI Project Ideas Page](https://github.com/asyncapi/community/blob/master/mentorship/summerofcode/2024/asyncapi-gsoc-ideas-page.md) for in-depth details on participating projects. +We are starting the year off with a bang as we got accepted to the [Google Summer of Code 2024](https://summerofcode.withgoogle.com/programs/2024/organizations/asyncapi) program after two years of rejections. It is an incredible achievement for the community, and we wouldn't have done it without our Doc's Lead, [Quetzalli Writes](https://www.linkedin.com/in/quetzalli-writes), who crafted an excellent proposal, and [Elegbede Azeez](https://twitter.com/_acebuild). We are very excited to have received this opportunity, and you can read [the AsyncAPI Project Ideas Page](https://github.com/asyncapi/community/blob/master/mentorship/summerofcode/2024/asyncapi-gsoc-ideas-page.md) for in-depth details on participating projects. ## AsyncAPI Conf on Tour 2024 The planning of AACoT'24 is already underway as we prepare for our first conference in Helsinki on the 28th - 29th of May. We are putting in the final touches to update our conference website with the latest details, and we will soon announce the Call for Speakers. In the meantime, be sure to start crafting those proposals and get ready to share your expertise with the community. diff --git a/markdown/blog/april-2023.md b/markdown/blog/april-2023.md index 5b4a0dc1be10..e37d2bacc520 100644 --- a/markdown/blog/april-2023.md +++ b/markdown/blog/april-2023.md @@ -13,7 +13,7 @@ authors: excerpt: 'April Community Update' --- -April brought ecstatic news that AsyncAPI is participating in the 2023 Google Season of Docs (GSoD). This achievement is a result of the exceptional work done by [Alejandra Quetzalli](https://www.linkedin.com/in/alejandra-quetzalli/), our lead documentation engineer and author of [Docs-as-Ecosystem: The Community Approach to Engineering](https://docsasecosystem.com/). Alejandra's contributions to the documentation process have been vital in improving the quality of AsyncAPI documentation, and her hard work has not gone unnoticed. As part of the GSoD program, Ale carefully reviewed and selected the best applicants out of the 87 applications received, and she conducted live writing/editing interviews. We are excited to welcome the five selected candidates, Mahfuza, Bhaswati, Rohit, Abhishek, and Hridyesh! We can't wait to see them contribute to AsyncAPI's documentation with Ale's guidance and mentorship. Do check out [Alejandra's Q1 AsyncAPI documentation report](https://www.asyncapi.com/blog/2023-Q1-docs-report) to learn more about our docs community's recent efforts. +April brought ecstatic news that AsyncAPI is participating in the 2023 Google Season of Docs (GSoD). This achievement is a result of the exceptional work done by [Quetzalli Writes](https://www.linkedin.com/in/quetzalli-writes/), our lead documentation engineer and author of [Docs-as-Ecosystem: The Community Approach to Engineering](https://docsasecosystem.com/). Quetzalli's contributions to the documentation process have been vital in improving the quality of AsyncAPI documentation, and her hard work has not gone unnoticed. As part of the GSoD program, Quetzalli carefully reviewed and selected the best applicants out of the 87 applications received, and she conducted live writing/editing interviews. We are excited to welcome the five selected candidates, Mahfuza, Bhaswati, Rohit, Abhishek, and Hridyesh! We can't wait to see them contribute to AsyncAPI's documentation with Quetzalli's guidance and mentorship. Do check out [Quetzalli's Q1 AsyncAPI documentation report](https://www.asyncapi.com/blog/2023-Q1-docs-report) to learn more about our docs community's recent efforts. ## AsyncAPI Bounty Program Trial We are thrilled to introduce the trial launch of the AsyncAPI Bounty Program. This program aims to express our gratitude and support to our maintainers and contributors who dedicate their time and efforts to drive the initiative forward. As part of the trial, we have selected seven projects comprising various coding, design, and technical writing tasks. We invite you to explore the [projects participating in the AsyncAPI Bounty Program trial run](https://github.com/issues?q=is%3Aopen+org%3Aasyncapi+label%3A%22bounty%22). diff --git a/markdown/blog/beyond-boundaries.md b/markdown/blog/beyond-boundaries.md index 155b85db0a85..3160b7e8fd49 100644 --- a/markdown/blog/beyond-boundaries.md +++ b/markdown/blog/beyond-boundaries.md @@ -74,7 +74,7 @@ Comparing this to the previous year, we are proud of this current trajectory and | 1 | [Add help/\{command} endpoint](https://github.com/asyncapi/server-api/issues/144) | [David Pereira](https://github.com/BOLT04) | Engineering | [Prince Rajpoot](https://github.com/princerajpoot20) | | 2 | [Website UI Kit design/dev project](https://github.com/asyncapi/design-system/issues/4) | [AceTheCreator](https://github.com/AceTheCreator) | Design | [AISHAT MUIBUDEEN](https://github.com/Mayaleeeee) | | 3 | [MVP integration of extensions catalog with AsyncAPI tools](https://github.com/asyncapi/extensions-catalog/issues/78) | [Lukasz Gornicki](https://github.com/derberg) | Engineering | [Sambhav Gupta](https://github.com/sambhavgupta0705) | -| 4 | [Documenting how different protocols work with AsyncAPI](https://github.com/orgs/asyncapi/discussions/533) | [Alejandra Quetzalli](https://github.com/alequetzalli) | Documentation | [Cynthia Peter](https://github.com/CynthiaPeter), [Arya Gupta](https://github.com/Arya-Gupta), [Joy Almeida](https://github.com/J0SAL), [Vaishnavi Nandakumar](https://github.com/VaishnaviNandakumar)| +| 4 | [Documenting how different protocols work with AsyncAPI](https://github.com/orgs/asyncapi/discussions/533) | [Quetzalli Writes](https://github.com/quetzalliwrites) | Documentation | [Cynthia Peter](https://github.com/CynthiaPeter), [Arya Gupta](https://github.com/Arya-Gupta), [Joy Almeida](https://github.com/J0SAL), [Vaishnavi Nandakumar](https://github.com/VaishnaviNandakumar)| | 5 | [Rewrite this template and NodeJS WS template](https://github.com/asyncapi/nodejs-template/issues/133) | [Lukasz Gornicki](https://github.com/derberg) | Engineering | [Kaushik Rishi](https://github.com/kaushik-rishi) | | 6 | [Simulator Desktop Application](https://github.com/asyncapi/community/issues/691) | [Nektarios Fifes](https://github.com/NektariosFifes) | Engineering | [Sumant Tirkey](https://github.com/SumantxD) | | 7 | [Tutorial document or separate guides for glee](https://github.com/asyncapi/glee/issues/431) | [Souvik](https://github.com/Souvikns) & [Khuda Dad Nomani](https://github.com/KhudaDad414) | Documentation | [Afzal Ansari](https://github.com/afzal442) | diff --git a/markdown/blog/changes-coming-docs.md b/markdown/blog/changes-coming-docs.md index cd2291fa5152..b35a280c20ab 100644 --- a/markdown/blog/changes-coming-docs.md +++ b/markdown/blog/changes-coming-docs.md @@ -7,9 +7,9 @@ tags: - Announcement cover: /img/posts/changes-coming-docs/mind-map.webp authors: - - name: Alejandra Quetzalli - photo: /img/avatars/canela-ale.webp - link: https://www.linkedin.com/in/alejandra-quetzalli/ + - name: Quetzalli Writes + photo: /img/avatars/canela-quetzalli.webp + link: https://www.linkedin.com/in/quetzalli-writes/ byline: AsyncAPI Dev Docs are getting a makeover! excerpt: Did you know that you can contribute Docs to AsyncAPI as well? Code isn't the only way to contribute to OSS; Dev Docs are a huge help that benefit the entire OSS ecosystem. --- @@ -17,13 +17,13 @@ excerpt: Did you know that you can contribute Docs to AsyncAPI as well? Code isn import ContributionNotes from '@/assets/docs/fragments/contribution-notes.md'; import TalkToMe from '@/assets/docs/fragments/talk-to-me.md'; -## 🦄 Hola, soy Alejandra Quetzalli +## 🦄 Hola, soy Quetzalli Writes ¡Hola! 😄 -AsyncAPI community, it's an absolute pleasure to meet you. My name is Alejandra. I was born and raised in México 🇲🇽, so my first language is Spanish. +AsyncAPI community, it's an absolute pleasure to meet you. My name is Quetzalli. I was born and raised in México 🇲🇽, so my first language is Spanish. -I’m a Senior Technical Writer 👩🏻‍💻 recently hired by [Postman](https://www.postman.com/alejandra-quetzalli) to focus solely on the Open-Source (OSS) [AsyncAPI initiative](https://www.asyncapi.com/) as primary owner for our AsyncAPI Dev Docs 📄 . +I’m a Senior Technical Writer 👩🏻‍💻 recently hired by Postman to focus solely on the Open-Source (OSS) [AsyncAPI initiative](https://www.asyncapi.com/) as primary owner for our AsyncAPI Dev Docs 📄 . I also recently [joined our initiative's Technical Steering Committee (TSC)](https://www.asyncapi.com/community/tsc)! The TSC is responsible for the oversight of the AsyncAPI Initiative, helping make decisions on a higher level, or when maintainers cannot find a consensus. diff --git a/markdown/blog/conference-2022.md b/markdown/blog/conference-2022.md index b6033ba376c2..6fe5bb20a286 100644 --- a/markdown/blog/conference-2022.md +++ b/markdown/blog/conference-2022.md @@ -93,11 +93,6 @@ Special thanks to Restream for supporting us with their amazing product for medi name: 'Aishat Muibudeen', avatar: 'https://avatars.githubusercontent.com/Mayaleeeee', link: 'https://github.com/Mayaleeeee' - }, - { - name: 'Alejandra Quetzalli', - avatar: 'https://avatars.githubusercontent.com/alequetzalli', - link: 'https://github.com/alequetzalli' }, { name: 'Azeez Elegbede', @@ -154,6 +149,11 @@ Special thanks to Restream for supporting us with their amazing product for medi avatar: 'https://avatars.githubusercontent.com/mcturco', link: 'https://github.com/mcturco' }, + { + name: 'Quetzalli Writes', + avatar: 'https://avatars.githubusercontent.com/quetzalliwrites', + link: 'https://github.com/quetzalliwrites' + }, { name: 'Sergio Moya', avatar: 'https://avatars.githubusercontent.com/smoya', diff --git a/markdown/blog/google-season-of-docs-2022.md b/markdown/blog/google-season-of-docs-2022.md index c83a1bcba9e8..ee7a9ecd3844 100644 --- a/markdown/blog/google-season-of-docs-2022.md +++ b/markdown/blog/google-season-of-docs-2022.md @@ -7,9 +7,9 @@ tags: - Announcement cover: /img/posts/gsod-2022/SeasonofDocs_Logo.webp authors: - - name: Alejandra Quetzalli - photo: /img/avatars/canela-ale.webp - link: https://www.linkedin.com/in/alejandra-quetzalli/ + - name: Quetzalli Writes + photo: /canela-quetzalli.webp + link: https://www.linkedin.com/in/quetzalli-writes/ byline: Our proposal? Update Docs Information Architecture excerpt: Check out the Docs project proposal we're submitting to GSoD 2022! You won't want to miss out. --- @@ -19,7 +19,7 @@ import ContributionNotes from '@/assets/docs/fragments/contribution-notes.md'; ## ¡Hola, AsyncAPI community! For today's blog post about AsyncAPI Docs 📑, I wanted to share with all technical writers about our organization’s plan for participation in `Google Season of Docs 2022 (GSoD)`. Any and all technical writers are welcome to come participate with us for GSoD 2022 season, regardless of tech background or years of experience! At AsyncAPI, we love mentoring folks who want to get involved in OSS, tech, and Docs. ❤️ -As some of you may remember from my [Gist Docs update for 31 Jan - 11 Feb 2022](https://gist.github.com/alequetzalli/94ca1ffb5d123b450501e40a4a3b56e2), I noted that GSoD 2022 was coming up and that AsyncAPI wanted to participate in the application process once it opened on February 23, 2022. +As some of you may remember from my [Gist Docs update for 31 Jan - 11 Feb 2022](https://gist.github.com/quetzalliwrites/94ca1ffb5d123b450501e40a4a3b56e2), I noted that GSoD 2022 was coming up and that AsyncAPI wanted to participate in the application process once it opened on February 23, 2022. In anticipation of this, I also created a new AsyncAPI Slack channel named `#temp-gsod-2022` that anyone can join! First, [join our Slack workspace](https://www.asyncapi.com/slack-invite) ☎️ and please respect [our slack etiquette](https://github.com/asyncapi/community/blob/master/slack-etiquette.md).🙂 Then join the `temp-gsod-2022` channel, our temporary channel to coordinate GSoC 2022 setup. I'll publish regular updates on where we are in the application process, so stay tuned as the process continues. 😄 @@ -56,7 +56,7 @@ AsyncAPI has several CLI and Tools markdown README documentation in miscellaneou In addition, we want to also target improving the [Generator tool](https://github.com/asyncapi/template-for-generator-templates) docs that are only READMEs in a repo right now. The Docs for this one tool are a big enough job to merit being our 2nd proposed project for 2022 GSoD. -We're also writing voluntary OSS bi-weekly updates via GitHub Gists to speak about the latest updates made in the AsyncAPI Docs Ecosystem. Due to our commitment to investing time in gaining interest in our community and getting Google excited about us, we've made sure to maintain updates about our `Google Season of Docs 2022` application too! In fact, you can take a look at the latest three where we made said mentions here in [AsyncAPI Docs update (31 Jan - 11 Feb 2022)](https://gist.github.com/alequetzalli/94ca1ffb5d123b450501e40a4a3b56e2), [AsyncAPI Docs update (14 Feb - 25 Feb 2022)](https://gist.github.com/alequetzalli/d34e3aececa49d10d0ddb2dc9938b477), and [AsyncAPI Docs update (28 Feb - 11 March 2022)](https://gist.github.com/alequetzalli/8f449f731b919193f4101098a69da14d). +We're also writing voluntary OSS bi-weekly updates via GitHub Gists to speak about the latest updates made in the AsyncAPI Docs Ecosystem. Due to our commitment to investing time in gaining interest in our community and getting Google excited about us, we've made sure to maintain updates about our `Google Season of Docs 2022` application too! In fact, you can take a look at the latest three where we made said mentions here in [AsyncAPI Docs update (31 Jan - 11 Feb 2022)](https://gist.github.com/quetzalliwrites/94ca1ffb5d123b450501e40a4a3b56e2), [AsyncAPI Docs update (14 Feb - 25 Feb 2022)](https://gist.github.com/quetzalliwrites/d34e3aececa49d10d0ddb2dc9938b477), and [AsyncAPI Docs update (28 Feb - 11 March 2022)](https://gist.github.com/quetzalliwrites/8f449f731b919193f4101098a69da14d). ### Measuring our Docs project’s success We will partially measure success in the Docs project by capturing specific feedback about the IA changes via our soon-to-come new [Docs Feedback card](https://github.com/asyncapi/website/issues/453). We need this specific and granular feedback to make sure we listen and make changes according to what the community requests from Docs. In previous AsyncAPI Docs Gist updates, we've mentioned that Design contributors were teaming with Docs on `/website`issue [#453](https://github.com/asyncapi/website/issues/453) for the ideation and development of our new **feedback card** that will be added at the bottom of each Docs page. What the community decided over the last 2 weeks was that the `Submit feedback` button in the card will publish the feedback anonymously via the AsyncAPI bot and create a new **GitHub Discussion** with said feedback: @@ -93,4 +93,4 @@ ___ ## Get started contributing to AsyncAPI Docs Today Last but not least, don't forget that -_-A.Q. 👩🏻‍💻 and Canela 🐕‍🦺_ \ No newline at end of file +_-Q.W. 👩🏻‍💻 and Canela 🐕‍🦺_ \ No newline at end of file diff --git a/markdown/blog/release-notes-3.0.0.md b/markdown/blog/release-notes-3.0.0.md index 75447e635408..32a371353806 100644 --- a/markdown/blog/release-notes-3.0.0.md +++ b/markdown/blog/release-notes-3.0.0.md @@ -359,4 +359,4 @@ We have [removed the note that stated we strived to be compatible with OpenAPI w ## Acknowledgements Spec 3.0 have been a massive undertaking, so I would like to say a huge "thank you!" to everyone who has been involved; maybe you commented on your views, added to discussions, joined the live meetings, championed changes, or reviewed proposed changes; this section is for you! -Thank you, [Simon Heimler](https://github.com/Fannon), [Vladimír Gorej](https://github.com/char0n), [Fran Méndez](https://github.com/fmvilas), [Lukasz Gornicki](https://github.com/derberg), [Sergio Moya](https://github.com/smoya), [Michael Davis](https://github.com/damaru-inc), [Maciej Urbańczyk](https://github.com/magicmatatjahu), [Jesse Menning](https://github.com/jessemenning), [Heiko Henning](https://github.com/GreenRover), [Gerald Loeffler ](https://github.com/GeraldLoeffler), [c-pius](https://github.com/c-pius), [Ian Cooper](https://github.com/iancooper), [Dale Lane](https://github.com/dalelane), [Jörg Walter](https://github.com/joerg-walter-de), [Nic Townsend](https://github.com/nictownsend), [Laurent Broudoux](https://github.com/lbroudoux), [olamiral](https://github.com/olamiral), [Iván García Sainz-Aja](https://github.com/ivangsa), [Fabian Bühler](https://github.com/buehlefs), [John Fallows](https://github.com/jfallows), [Adrian Hope-Bailie](https://github.com/adrianhopebailie), [Christian (prdatur)](https://github.com/prdatur), [Karl Morrison](https://github.com/basickarl), [Javier Jiménez Roda](https://github.com/jjimenezroda), [Marek Sebera](https://github.com/smarek), [Nathanaël Lécaudé](https://github.com/natcl), [Jeremy Whitlock](https://github.com/whitlockjc), [souvik](https://github.com/Souvikns), [Animesh Kumar](https://www.github.com/animeshkumar923), [Samir AMZANI](https://github.com/Amzani), [Alejandra Quetzalli](https://github.com/alequetzalli), [Vaishnavi](https://github.com/VaishnaviNandakumar), [Mahfuza](https://github.com/mhmohona), [Bhaswati](https://github.com/BhaswatiRoy), [Cynthia Peter](https://github.com/CynthiaPeter), [Arya Gupta](https://github.com/Arya-Gupta), [Joy Almeida](https://github.com/J0SAL), [Hridyesh](https://github.com/kakabisht), [Rohit](https://github.com/TRohit20), [Ashish Padhy](https://github.com/Shurtu-gal), [Al Amin Muhammad](https://github.com/alaminthespecial), [nickshoe](https://github.com/nickshoe), [Khuda Dad Nomani](https://github.com/KhudaDad414), [V Thulisile Sibanda](https://github.com/thulieblack), [Ace](https://github.com/AceTheCreator), [Mihael Bosnjak](https://github.com/mboss37), [Sambhav Gupta](https://github.com/sambhavgupta0705), [Jonas Lagoni](https://github.com/jonaslagoni), [Afzal Ansari](https://github.com/afzal442) \ No newline at end of file +Thank you, [Simon Heimler](https://github.com/Fannon), [Vladimír Gorej](https://github.com/char0n), [Fran Méndez](https://github.com/fmvilas), [Lukasz Gornicki](https://github.com/derberg), [Sergio Moya](https://github.com/smoya), [Michael Davis](https://github.com/damaru-inc), [Maciej Urbańczyk](https://github.com/magicmatatjahu), [Jesse Menning](https://github.com/jessemenning), [Heiko Henning](https://github.com/GreenRover), [Gerald Loeffler ](https://github.com/GeraldLoeffler), [c-pius](https://github.com/c-pius), [Ian Cooper](https://github.com/iancooper), [Dale Lane](https://github.com/dalelane), [Jörg Walter](https://github.com/joerg-walter-de), [Nic Townsend](https://github.com/nictownsend), [Laurent Broudoux](https://github.com/lbroudoux), [olamiral](https://github.com/olamiral), [Iván García Sainz-Aja](https://github.com/ivangsa), [Fabian Bühler](https://github.com/buehlefs), [John Fallows](https://github.com/jfallows), [Adrian Hope-Bailie](https://github.com/adrianhopebailie), [Christian (prdatur)](https://github.com/prdatur), [Karl Morrison](https://github.com/basickarl), [Javier Jiménez Roda](https://github.com/jjimenezroda), [Marek Sebera](https://github.com/smarek), [Nathanaël Lécaudé](https://github.com/natcl), [Jeremy Whitlock](https://github.com/whitlockjc), [souvik](https://github.com/Souvikns), [Animesh Kumar](https://www.github.com/animeshkumar923), [Samir AMZANI](https://github.com/Amzani), [Quetzalli Writes](https://github.com/quetzalliwrites), [Vaishnavi](https://github.com/VaishnaviNandakumar), [Mahfuza](https://github.com/mhmohona), [Bhaswati](https://github.com/BhaswatiRoy), [Cynthia Peter](https://github.com/CynthiaPeter), [Arya Gupta](https://github.com/Arya-Gupta), [Joy Almeida](https://github.com/J0SAL), [Hridyesh](https://github.com/kakabisht), [Rohit](https://github.com/TRohit20), [Ashish Padhy](https://github.com/Shurtu-gal), [Al Amin Muhammad](https://github.com/alaminthespecial), [nickshoe](https://github.com/nickshoe), [Khuda Dad Nomani](https://github.com/KhudaDad414), [V Thulisile Sibanda](https://github.com/thulieblack), [Ace](https://github.com/AceTheCreator), [Mihael Bosnjak](https://github.com/mboss37), [Sambhav Gupta](https://github.com/sambhavgupta0705), [Jonas Lagoni](https://github.com/jonaslagoni), [Afzal Ansari](https://github.com/afzal442) \ No newline at end of file diff --git a/markdown/blog/socketio-part1.md b/markdown/blog/socketio-part1.md index a3894c7c2ba2..323ec7fe94df 100644 --- a/markdown/blog/socketio-part1.md +++ b/markdown/blog/socketio-part1.md @@ -58,6 +58,6 @@ Note that the scope of this documentation is limited to the interface between th Stay tuned for the next (and most exciting) part of this series which adds AsyncAPI into the equation. In the meantime, you can check out [Asynction](https://github.com/dedoussis/asynction), a python Socket.IO micro-framework driven by the AsyncAPI specification. -_Special thanks to [derberq](https://twitter.com/derberq) and [alequetzalli](https://twitter.com/QuetzalliAle) for reviewing this post!_ 🙏 +_Special thanks to [derberq](https://twitter.com/derberq) and [quetzalliwrites](https://x.com/quetzalliwrites) for reviewing this post!_ 🙏 > Photo by Matt Howard on Unsplash diff --git a/markdown/blog/socketio-part2.md b/markdown/blog/socketio-part2.md index 8a31af96d2af..93287087fed7 100644 --- a/markdown/blog/socketio-part2.md +++ b/markdown/blog/socketio-part2.md @@ -503,6 +503,6 @@ Any piece of feedback would be much appreciated. For any questions, comments, or corrections, feel free to reach out to me at [dimitrios@dedouss.is](mailto:dimitrios@dedouss.is). -_A special shout out to [derberq](https://twitter.com/derberq), [alequetzalli](https://twitter.com/QuetzalliAle), and the wider AsyncAPI community for being particularly helpful and responsive._ 🙇 +_A special shout out to [derberq](https://twitter.com/derberq), [quetzalliwrites](https://x.com/quetzalliwrites), and the wider AsyncAPI community for being particularly helpful and responsive._ 🙇 > Photo by Matt Howard on Unsplash diff --git a/markdown/docs/tools/cli/usage.md b/markdown/docs/tools/cli/usage.md index 84f59e8803c4..af6eb4531a29 100644 --- a/markdown/docs/tools/cli/usage.md +++ b/markdown/docs/tools/cli/usage.md @@ -27,7 +27,7 @@ $ npm install -g @asyncapi/cli $ asyncapi COMMAND running command... $ asyncapi (--version) -@asyncapi/cli/2.11.0 linux-x64 node-v18.20.5 +@asyncapi/cli/2.12.0 linux-x64 node-v18.20.5 $ asyncapi --help [COMMAND] USAGE $ asyncapi COMMAND @@ -101,7 +101,7 @@ EXAMPLES $ asyncapi bundle ./asyncapi.yaml -o final-asyncapi.yaml --base ../public-api/main.yaml --baseDir ./social-media/comments-service ``` -_See code: [src/commands/bundle.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/bundle.ts)_ +_See code: [src/commands/bundle.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/bundle.ts)_ ## `asyncapi config` @@ -115,7 +115,7 @@ DESCRIPTION CLI config settings ``` -_See code: [src/commands/config/index.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/config/index.ts)_ +_See code: [src/commands/config/index.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/config/index.ts)_ ## `asyncapi config analytics` @@ -135,7 +135,7 @@ DESCRIPTION Enable or disable analytics for metrics collection ``` -_See code: [src/commands/config/analytics.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/config/analytics.ts)_ +_See code: [src/commands/config/analytics.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/config/analytics.ts)_ ## `asyncapi config context` @@ -149,7 +149,7 @@ DESCRIPTION Manage short aliases for full paths to AsyncAPI documents ``` -_See code: [src/commands/config/context/index.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/config/context/index.ts)_ +_See code: [src/commands/config/context/index.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/config/context/index.ts)_ ## `asyncapi config context add CONTEXT-NAME SPEC-FILE-PATH` @@ -171,7 +171,7 @@ DESCRIPTION Add a context to the store ``` -_See code: [src/commands/config/context/add.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/config/context/add.ts)_ +_See code: [src/commands/config/context/add.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/config/context/add.ts)_ ## `asyncapi config context current` @@ -188,7 +188,7 @@ DESCRIPTION Shows the current context that is being used ``` -_See code: [src/commands/config/context/current.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/config/context/current.ts)_ +_See code: [src/commands/config/context/current.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/config/context/current.ts)_ ## `asyncapi config context edit CONTEXT-NAME NEW-SPEC-FILE-PATH` @@ -209,7 +209,7 @@ DESCRIPTION Edit a context in the store ``` -_See code: [src/commands/config/context/edit.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/config/context/edit.ts)_ +_See code: [src/commands/config/context/edit.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/config/context/edit.ts)_ ## `asyncapi config context init [CONTEXT-FILE-PATH]` @@ -232,7 +232,7 @@ DESCRIPTION Initialize context ``` -_See code: [src/commands/config/context/init.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/config/context/init.ts)_ +_See code: [src/commands/config/context/init.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/config/context/init.ts)_ ## `asyncapi config context list` @@ -249,7 +249,7 @@ DESCRIPTION List all the stored contexts in the store ``` -_See code: [src/commands/config/context/list.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/config/context/list.ts)_ +_See code: [src/commands/config/context/list.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/config/context/list.ts)_ ## `asyncapi config context remove CONTEXT-NAME` @@ -269,7 +269,7 @@ DESCRIPTION Delete a context from the store ``` -_See code: [src/commands/config/context/remove.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/config/context/remove.ts)_ +_See code: [src/commands/config/context/remove.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/config/context/remove.ts)_ ## `asyncapi config context use CONTEXT-NAME` @@ -289,7 +289,7 @@ DESCRIPTION Set a context as current ``` -_See code: [src/commands/config/context/use.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/config/context/use.ts)_ +_See code: [src/commands/config/context/use.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/config/context/use.ts)_ ## `asyncapi config versions` @@ -306,7 +306,7 @@ DESCRIPTION Show versions of AsyncAPI tools used ``` -_See code: [src/commands/config/versions.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/config/versions.ts)_ +_See code: [src/commands/config/versions.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/config/versions.ts)_ ## `asyncapi convert [SPEC-FILE]` @@ -334,7 +334,7 @@ DESCRIPTION Convert asyncapi documents older to newer versions or OpenAPI/postman-collection documents to AsyncAPI ``` -_See code: [src/commands/convert.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/convert.ts)_ +_See code: [src/commands/convert.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/convert.ts)_ ## `asyncapi diff OLD NEW` @@ -375,7 +375,7 @@ DESCRIPTION Find diff between two asyncapi files ``` -_See code: [src/commands/diff.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/diff.ts)_ +_See code: [src/commands/diff.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/diff.ts)_ ## `asyncapi format [SPEC-FILE]` @@ -398,7 +398,7 @@ DESCRIPTION Convert asyncapi documents from any format to yaml, yml or JSON ``` -_See code: [src/commands/format.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/format.ts)_ +_See code: [src/commands/format.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/format.ts)_ ## `asyncapi generate` @@ -412,7 +412,7 @@ DESCRIPTION Generate typed models or other things like clients, applications or docs using AsyncAPI Generator templates. ``` -_See code: [src/commands/generate/index.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/generate/index.ts)_ +_See code: [src/commands/generate/index.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/generate/index.ts)_ ## `asyncapi generate fromTemplate ASYNCAPI TEMPLATE` @@ -457,7 +457,7 @@ EXAMPLES $ asyncapi generate fromTemplate asyncapi.yaml @asyncapi/html-template --param version=1.0.0 singleFile=true --output ./docs --force-write ``` -_See code: [src/commands/generate/fromTemplate.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/generate/fromTemplate.ts)_ +_See code: [src/commands/generate/fromTemplate.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/generate/fromTemplate.ts)_ ## `asyncapi generate models LANGUAGE FILE` @@ -527,7 +527,7 @@ DESCRIPTION Generates typed models ``` -_See code: [src/commands/generate/models.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/generate/models.ts)_ +_See code: [src/commands/generate/models.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/generate/models.ts)_ ## `asyncapi new` @@ -585,7 +585,7 @@ EXAMPLES $ 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 ``` -_See code: [src/commands/new/index.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/new/index.ts)_ +_See code: [src/commands/new/index.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/new/index.ts)_ ## `asyncapi new file` @@ -643,7 +643,7 @@ EXAMPLES $ 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 ``` -_See code: [src/commands/new/file.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/new/file.ts)_ +_See code: [src/commands/new/file.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/new/file.ts)_ ## `asyncapi new glee` @@ -665,7 +665,7 @@ DESCRIPTION Creates a new Glee project ``` -_See code: [src/commands/new/glee.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/new/glee.ts)_ +_See code: [src/commands/new/glee.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/new/glee.ts)_ ## `asyncapi new template` @@ -689,7 +689,7 @@ DESCRIPTION Creates a new template ``` -_See code: [src/commands/new/template.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/new/template.ts)_ +_See code: [src/commands/new/template.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/new/template.ts)_ ## `asyncapi optimize [SPEC-FILE]` @@ -731,7 +731,7 @@ EXAMPLES $ asyncapi optimize ./asyncapi.yaml --ignore=schema ``` -_See code: [src/commands/optimize.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/optimize.ts)_ +_See code: [src/commands/optimize.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/optimize.ts)_ ## `asyncapi pretty SPEC-FILE` @@ -756,7 +756,7 @@ EXAMPLES $ asyncapi pretty ./asyncapi.yaml --output formatted-asyncapi.yaml ``` -_See code: [src/commands/pretty.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/pretty.ts)_ +_See code: [src/commands/pretty.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/pretty.ts)_ ## `asyncapi start` @@ -770,7 +770,7 @@ DESCRIPTION Starts AsyncAPI-related services. Currently, it supports launching the AsyncAPI Studio ``` -_See code: [src/commands/start/index.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/start/index.ts)_ +_See code: [src/commands/start/index.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/start/index.ts)_ ## `asyncapi start studio` @@ -789,7 +789,7 @@ DESCRIPTION starts a new local instance of Studio ``` -_See code: [src/commands/start/studio.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/start/studio.ts)_ +_See code: [src/commands/start/studio.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/start/studio.ts)_ ## `asyncapi validate [SPEC-FILE]` @@ -820,5 +820,5 @@ DESCRIPTION validate asyncapi file ``` -_See code: [src/commands/validate.ts](https://github.com/asyncapi/cli/blob/v2.11.0/src/commands/validate.ts)_ +_See code: [src/commands/validate.ts](https://github.com/asyncapi/cli/blob/v2.12.0/src/commands/validate.ts)_ diff --git a/package-lock.json b/package-lock.json index 87b500419b87..82080d33a35c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13722,9 +13722,9 @@ } }, "node_modules/express": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -13745,7 +13745,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -13760,6 +13760,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/debug": { @@ -23339,9 +23343,9 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" }, "node_modules/path-type": { "version": "4.0.0", diff --git a/public/_redirects b/public/_redirects index d4d353e71aed..d9dd86ccbee1 100644 --- a/public/_redirects +++ b/public/_redirects @@ -53,7 +53,7 @@ https://www.asyncapi.io/* https://www.asyncapi.com/:splat 301! /asyncapi-react https://asyncapi.github.io/asyncapi-react 301! # Slack -/slack-invite https://join.slack.com/t/asyncapi/shared_invite/zt-2q37kkext-RlUOZvxwtCcSHdLhZJByQw 302! +/slack-invite https://join.slack.com/t/asyncapi/shared_invite/zt-2vilph6cy-rFnALuzdn5XUWcp1kRfodw 302! # Central Maven repository verification /OSSRH-63280 https://github.com/asyncapi/java-asyncapi diff --git a/public/img/avatars/canela-ale.webp b/public/img/avatars/canela-quetzalli.webp similarity index 100% rename from public/img/avatars/canela-ale.webp rename to public/img/avatars/canela-quetzalli.webp diff --git a/public/img/homepage/ale.webp b/public/img/homepage/que.webp similarity index 100% rename from public/img/homepage/ale.webp rename to public/img/homepage/que.webp diff --git a/scripts/tools/combine-tools.js b/scripts/tools/combine-tools.js index 602262428fa1..1b1367b15ccb 100644 --- a/scripts/tools/combine-tools.js +++ b/scripts/tools/combine-tools.js @@ -106,37 +106,44 @@ const getFinalTool = async (toolObject) => { // Combine the automated tools and manual tools list into single JSON object file, and // lists down all the language and technology tags in one JSON file. const combineTools = async (automatedTools, manualTools, toolsPath, tagsPath) => { - for (const key in automatedTools) { - let finalToolsList = []; - if (automatedTools[key].toolsList.length) { - for (const tool of automatedTools[key].toolsList) { - finalToolsList.push(await getFinalTool(tool)) + try { + for (const key in automatedTools) { + let finalToolsList = []; + if (automatedTools[key].toolsList.length) { + for (const tool of automatedTools[key].toolsList) { + finalToolsList.push(await getFinalTool(tool)) + } } - } - if (manualTools[key] && manualTools[key].toolsList.length) { - for (const tool of manualTools[key].toolsList) { - let isAsyncAPIrepo; - const isValid = await validate(tool) - if (isValid) { - if (tool?.links?.repoUrl) { - const url = new URL(tool.links.repoUrl) - isAsyncAPIrepo = url.href.startsWith("https://github.com/asyncapi/") - } else isAsyncAPIrepo = false - let toolObject = await createToolObject(tool, "", "", isAsyncAPIrepo) - finalToolsList.push(await getFinalTool(toolObject)) - } else { - console.error('Script is not failing, it is just dropping errors for further investigation'); - console.error(`Invalid ${tool.title} .asyncapi-tool file.`); - console.error(`Located in manual-tools.json file`); - console.error('Validation errors:', JSON.stringify(validate.errors, null, 2)); + if (manualTools[key]?.toolsList?.length) { + for (const tool of manualTools[key].toolsList) { + let isAsyncAPIrepo; + const isValid = await validate(tool) + if (isValid) { + if (tool?.links?.repoUrl) { + const url = new URL(tool.links.repoUrl) + isAsyncAPIrepo = url.href.startsWith("https://github.com/asyncapi/") + } else isAsyncAPIrepo = false + let toolObject = await createToolObject(tool, "", "", isAsyncAPIrepo) + finalToolsList.push(await getFinalTool(toolObject)) + } else { + console.error({ + message: 'Tool validation failed', + tool: tool.title, + source: 'manual-tools.json', + errors: validate.errors, + note: 'Script continues execution, error logged for investigation' + }); + } } } + finalToolsList.sort((tool, anotherTool) => tool.title.localeCompare(anotherTool.title)); + finalTools[key].toolsList = finalToolsList } - finalToolsList.sort((tool, anotherTool) => tool.title.localeCompare(anotherTool.title)); - finalTools[key].toolsList = finalToolsList + fs.writeFileSync(toolsPath, JSON.stringify(finalTools)); + fs.writeFileSync(tagsPath, JSON.stringify({ languages: languageList, technologies: technologyList }),) + } catch (err) { + throw new Error(`Error combining tools: ${err}`); } - fs.writeFileSync(toolsPath,JSON.stringify(finalTools)); - fs.writeFileSync(tagsPath,JSON.stringify({ languages: languageList, technologies: technologyList }),) } -module.exports = { combineTools } \ No newline at end of file +module.exports = { combineTools } diff --git a/scripts/tools/tools-object.js b/scripts/tools/tools-object.js index e5a30334f7d3..1d8c73f8074b 100644 --- a/scripts/tools/tools-object.js +++ b/scripts/tools/tools-object.js @@ -9,7 +9,6 @@ addFormats(ajv, ["uri"]) const validate = ajv.compile(schema) const { convertToJson } = require('../utils'); - // Config options set for the Fuse object const options = { includeScore: true, @@ -25,8 +24,8 @@ const fuse = new Fuse(categoryList, options) // isAsyncAPIrepo boolean variable to define whether the tool repository is under // AsyncAPI organization or not, to create a JSON tool object as required in the frontend // side to show ToolCard. -const createToolObject = async (toolFile, repositoryUrl='', repoDescription='', isAsyncAPIrepo='') => { - let resultantObject = { +const createToolObject = async (toolFile, repositoryUrl = '', repoDescription = '', isAsyncAPIrepo = '') => { + const resultantObject = { title: toolFile.title, description: toolFile?.description ? toolFile.description : repoDescription, links: { @@ -47,67 +46,71 @@ const createToolObject = async (toolFile, repositoryUrl='', repoDescription='', // and creating a JSON tool object in which all the tools are listed in defined // categories order, which is then updated in `automated-tools.json` file. async function convertTools(data) { - let finalToolsObject = {}; - const dataArray = data.items; - - // initialising finalToolsObject with all categories inside it with proper elements in each category - for (var index in categoryList) { - finalToolsObject[categoryList[index].name] = { - description: categoryList[index].description, - toolsList: [] - }; - } + try { + let finalToolsObject = {}; + const dataArray = data.items; - for (let tool of dataArray) { - try { - if (tool.name.startsWith('.asyncapi-tool')) { - // extracting the reference id of the repository which will be used to extract the path of the .asyncapi-tool file in the Tools repository - // ex: for a url = "https://api.github.com/repositories/351453552/contents/.asyncapi-tool?ref=61855e7365a881e98c2fe667a658a0005753d873" - // the text (id) present after '=' gives us a reference id for the repo - let reference_id = tool.url.split("=")[1]; - let download_url = `https://raw.githubusercontent.com/${tool.repository.full_name}/${reference_id}/${tool.path}`; + // initialising finalToolsObject with all categories inside it with proper elements in each category + finalToolsObject = Object.fromEntries( + categoryList.map((category) => [ + category.name, + { + description: category.description, + toolsList: [] + } + ]) + ); - const { data: toolFileContent } = await axios.get(download_url); + await Promise.all(dataArray.map(async (tool) => { + try { + if (tool.name.startsWith('.asyncapi-tool')) { + const referenceId = tool.url.split('=')[1]; + const downloadUrl = `https://raw.githubusercontent.com/${tool.repository.full_name}/${referenceId}/${tool.path}`; - //some stuff can be YAML - const jsonToolFileContent = await convertToJson(toolFileContent) + const { data: toolFileContent } = await axios.get(downloadUrl); - //validating against JSON Schema for tools file - const isValid = await validate(jsonToolFileContent) + //some stuff can be YAML + const jsonToolFileContent = await convertToJson(toolFileContent) - if (isValid) { - let repositoryUrl = tool.repository.html_url; - let repoDescription = tool.repository.description; - let isAsyncAPIrepo = tool.repository.owner.login === "asyncapi"; - let toolObject = await createToolObject(jsonToolFileContent, repositoryUrl, repoDescription, isAsyncAPIrepo); + //validating against JSON Schema for tools file + const isValid = await validate(jsonToolFileContent) - // Tool Object is appended to each category array according to Fuse search for categories inside Tool Object - jsonToolFileContent.filters.categories.forEach(async (category) => { - const categorySearch = await fuse.search(category); + if (isValid) { + const repositoryUrl = tool.repository.html_url; + const repoDescription = tool.repository.description; + const isAsyncAPIrepo = tool.repository.owner.login === 'asyncapi'; + const toolObject = await createToolObject( + jsonToolFileContent, + repositoryUrl, + repoDescription, + isAsyncAPIrepo + ); - if (categorySearch.length) { - let searchedCategoryName = categorySearch[0].item.name - if (!finalToolsObject[searchedCategoryName].toolsList.find((element => element === toolObject))) - finalToolsObject[searchedCategoryName].toolsList.push(toolObject); - } else { - // if Tool object has a category, not defined in our categorylist, then this provides a `other` category to the tool. - if (!finalToolsObject['Others'].toolsList.find((element => element === toolObject))) - finalToolsObject['Others'].toolsList.push(toolObject); - } - }); - } else { - console.error('Script is not failing, it is just dropping errors for further investigation'); - console.error('Invalid .asyncapi-tool file.'); - console.error(`Located in: ${tool.html_url}`); - console.error('Validation errors:', JSON.stringify(validate.errors, null, 2)); + // Tool Object is appended to each category array according to Fuse search for categories inside Tool Object + await Promise.all(jsonToolFileContent.filters.categories.map(async (category) => { + const categorySearch = await fuse.search(category); + const targetCategory = categorySearch.length ? categorySearch[0].item.name : 'Others'; + const { toolsList } = finalToolsObject[targetCategory]; + if (!toolsList.includes(toolObject)) { + toolsList.push(toolObject); + } + })); + } else { + console.error('Script is not failing, it is just dropping errors for further investigation'); + console.error('Invalid .asyncapi-tool file.'); + console.error(`Located in: ${tool.html_url}`); + console.error('Validation errors:', JSON.stringify(validate.errors, null, 2)); + } } + } catch (err) { + console.error(err) + throw err; } - } catch (err) { - console.error(err) - throw err; - } + })) + return finalToolsObject; + } catch (err) { + throw new Error(`Error processing tool: ${err.message}`) } - return finalToolsObject; } -module.exports = {convertTools, createToolObject} \ No newline at end of file +module.exports = { convertTools, createToolObject } diff --git a/tests/fixtures/combineToolsData.js b/tests/fixtures/combineToolsData.js new file mode 100644 index 000000000000..452764ac9192 --- /dev/null +++ b/tests/fixtures/combineToolsData.js @@ -0,0 +1,212 @@ +const expectedDataT1 = { + languages: [ + { + name: 'JavaScript', + color: 'bg-[#57f281]', + borderColor: 'border-[#37f069]', + }, + { + name: 'Python', + color: 'bg-[#3572A5]', + borderColor: 'border-[#3572A5]', + }, + ], + technologies: [ + { + name: 'Node.js', + color: 'bg-[#61d0f2]', + borderColor: 'border-[#40ccf7]', + }, + { + name: 'Flask', + color: 'bg-[#000000]', + borderColor: 'border-[#FFFFFF]', + }, + ], +}; + +const manualToolsWithMissingData = [ + { + title: 'Tool C', + filters: {}, + links: { repoUrl: 'https://github.com/asyncapi/tool-c' }, + }, +]; + +const manualToolsToSort = { + category1: { + description: 'Sample Category', + toolsList: [ + { + title: 'Tool Z', + filters: { language: 'JavaScript' }, + links: { repoUrl: 'https://github.com/asyncapi/tool-z' }, + }, + { + title: 'Tool A', + filters: { language: 'Python' }, + links: { repoUrl: 'https://github.com/asyncapi/tool-a' }, + }, + ], + }, +}; + +const toolWithMultipleLanguages = { + title: 'Multi-Language Tool', + filters: { + language: ['JavaScript', 'Python', 'NewLanguage'], + technology: ['Node.js'], + }, + links: { repoUrl: 'https://github.com/example/multi-language-tool' }, +}; + +const automatedToolsT5 = { + category1: { + description: 'Category 1 Description', + toolsList: [toolWithMultipleLanguages], + }, +}; + +const invalidToolT4 = { title: 'Invalid Tool' }; + +const automatedToolsT4 = { + category1: { + description: 'Category 1 Description', + toolsList: [], + }, +}; +const manualToolsT4 = { + category1: { + toolsList: [invalidToolT4], + }, +}; + +const toolWithNewTagsT6 = { + title: 'New Tags Tool', + filters: { + language: 'NewLanguage', + technology: ['NewTechnology'], + }, + links: { repoUrl: 'https://github.com/example/new-tags-tool' }, +}; + +const automatedToolsT6 = { + category1: { + description: 'Category 1 Description', + toolsList: [toolWithNewTagsT6], + }, +}; + +const toolWithNewLanguageT7 = { + title: 'New Language Tool', + filters: { + language: 'Go', + technology: ['Node.js'], + }, + links: { repoUrl: 'https://github.com/example/new-language-tool' }, +}; + +const automatedToolsT7 = { + category1: { + description: 'Category 1 Description', + toolsList: [toolWithNewLanguageT7], + }, +}; + +const validToolT8 = { + title: 'Valid Tool', + filters: { + language: 'JavaScript', + technology: ['Node.js'], + }, + links: { repoUrl: 'https://github.com/asyncapi/valid-tool' }, +}; + +const automatedToolsT8 = { + category1: { + description: 'Category 1 Description', + toolsList: [], + }, +}; + +const manualToolsT8 = { + category1: { + toolsList: [validToolT8], + }, +}; + +const toolWithoutRepoUrlT9 = { + title: 'Tool Without Repo', + filters: { + language: 'Python', + technology: ['Flask'], + }, + links: {}, +}; + +const automatedToolsT9 = { + category1: { + description: 'Category 1 Description', + toolsList: [], + }, +}; + +const manualToolsT9 = { + category1: { + toolsList: [toolWithoutRepoUrlT9], + }, +}; + +const invalidAutomatedToolsT10 = { + invalidCategory: { + description: 'Invalid Category Description', + toolsList: [], + }, +}; + +const manualToolsWithInvalidURLT11 = { + category1: { + toolsList: [ + { + title: 'Tool with Invalid URL', + filters: { language: 'JavaScript' }, + links: { repoUrl: 'invalid-url' }, + }, + ], + }, +}; + +const circularTool = { + title: 'Circular Tool', + filters: { + language: 'JavaScript', + technology: ['Node.js'], + }, + links: { repoUrl: 'https://github.com/asyncapi/circular-tool' }, +}; + +const automatedToolsT12 = { + category1: { + description: 'Category 1', + toolsList: [circularTool], + }, +}; + +module.exports = { + expectedDataT1, + manualToolsWithMissingData, + manualToolsToSort, + automatedToolsT5, + automatedToolsT4, + manualToolsT4, + automatedToolsT6, + automatedToolsT7, + automatedToolsT8, + manualToolsT8, + automatedToolsT9, + manualToolsT9, + circularTool, + automatedToolsT12, + invalidAutomatedToolsT10, + manualToolsWithInvalidURLT11, +}; diff --git a/tests/fixtures/tools/automated-tools.json b/tests/fixtures/tools/automated-tools.json new file mode 100644 index 000000000000..1184da03e718 --- /dev/null +++ b/tests/fixtures/tools/automated-tools.json @@ -0,0 +1,17 @@ +{ + "category1": { + "description": "Sample Category", + "toolsList": [ + { + "title": "Tool B", + "filters": { + "language": "Python", + "technology": ["Flask"] + }, + "links": { + "repoUrl": "https://github.com/asyncapi/tool-b" + } + } + ] + } +} diff --git a/tests/fixtures/tools/manual-tools.json b/tests/fixtures/tools/manual-tools.json new file mode 100644 index 000000000000..47469bc1a7e7 --- /dev/null +++ b/tests/fixtures/tools/manual-tools.json @@ -0,0 +1,12 @@ +[ + { + "title": "Tool A", + "filters": { + "language": "JavaScript", + "technology": ["Node.js"] + }, + "links": { + "repoUrl": "https://github.com/asyncapi/tool-a" + } + } +] diff --git a/tests/helper/toolsObjectData.js b/tests/helper/toolsObjectData.js new file mode 100644 index 000000000000..929d985f9773 --- /dev/null +++ b/tests/helper/toolsObjectData.js @@ -0,0 +1,79 @@ +const createToolRepositoryData = ({ + name = '.asyncapi-tool', + refId = '61855e7365a881e98c2fe667a658a0005753d873', + owner = 'asyncapi', + repoName = 'example-repo', + description = 'Example repository', + path = '.asyncapi-tool' +} = {}) => ({ + name, + url: `https://api.github.com/repositories/351453552/contents/${path}?ref=${refId}`, + repository: { + full_name: `${owner}/${repoName}`, + html_url: `https://github.com/${owner}/${repoName}`, + description, + owner: { login: owner } + }, + path +}); + +const createToolFileContent = ({ + title = 'Example Tool', + description = 'This is an example tool.', + repoUrl = null, + categories = ['Category1'], + hasCommercial = false, + additionalLinks = {}, + additionalFilters = {} +} = {}) => ({ + title, + description, + links: { + repoUrl: repoUrl || `https://github.com/asyncapi/${encodeURIComponent(title.toLowerCase().replace(/\s+/g, '-'))}`, + ...additionalLinks + }, + filters: { categories, hasCommercial, ...additionalFilters } +}); + +const createExpectedToolObject = ({ + title = 'Example Tool', + description = 'This is an example tool.', + repoUrl = null, + categories = ['Category1'], + hasCommercial = false, + isAsyncAPIOwner = true, + additionalLinks = {}, + additionalFilters = {} +} = {}) => + createToolFileContent({ + title, + description, + repoUrl, + categories, + hasCommercial, + additionalLinks, + additionalFilters: { isAsyncAPIOwner, ...additionalFilters } + }); + +const createMockData = (tools = []) => ({ + items: tools.map((tool) => + typeof tool === 'string' + ? createToolRepositoryData({ name: `.asyncapi-tool-${tool}`, repoName: tool }) + : createToolRepositoryData(tool) + ) +}); + +const createMalformedYAML = ({ + title = 'Malformed Tool', + description = 'This tool has malformed YAML.', + repoUrl = 'https://github.com/asyncapi/malformed-repo' } = {}) => ` + title: ${title} + description: ${description} + links: + repoUrl: ${repoUrl} + filters: + categories: + - Category1 +`; + +module.exports = { createToolFileContent, createExpectedToolObject, createMockData, createMalformedYAML }; diff --git a/tests/tools/combine-tools.test.js b/tests/tools/combine-tools.test.js new file mode 100644 index 000000000000..622067a57462 --- /dev/null +++ b/tests/tools/combine-tools.test.js @@ -0,0 +1,229 @@ +const fs = require('fs'); +const path = require('path'); +const { combineTools } = require('../../scripts/tools/combine-tools'); +const { + expectedDataT1, + manualToolsWithMissingData, + manualToolsToSort, + automatedToolsT5, + automatedToolsT4, + manualToolsT4, + automatedToolsT6, + automatedToolsT7, + automatedToolsT8, + manualToolsT8, + automatedToolsT9, + manualToolsT9, + automatedToolsT12, + invalidAutomatedToolsT10, + manualToolsWithInvalidURLT11, + circularTool +} = require('../fixtures/combineToolsData'); + +jest.mock('ajv', () => { + return jest.fn().mockImplementation(() => ({ + compile: jest.fn().mockImplementation(() => (data) => data.title !== 'Invalid Tool'), + })); +}); + + +jest.mock('ajv-formats', () => { + return jest.fn(); +}); + +jest.mock('../../scripts/tools/tags-color', () => ({ + languagesColor: [ + { name: 'JavaScript', color: 'bg-[#57f281]', borderColor: 'border-[#37f069]' }, + { name: 'Python', color: 'bg-[#3572A5]', borderColor: 'border-[#3572A5]' } + ], + technologiesColor: [ + { name: 'Node.js', color: 'bg-[#61d0f2]', borderColor: 'border-[#40ccf7]' }, + { name: 'Flask', color: 'bg-[#000000]', borderColor: 'border-[#FFFFFF]' } + ] +})); + +jest.mock('../../scripts/tools/categorylist', () => ({ + categoryList: [ + { name: 'category1', description: 'Sample Category 1' }, + { name: 'category2', description: 'Sample Category 2' } + ] +})); + +const readJSON = (filePath) => JSON.parse(fs.readFileSync(filePath, 'utf-8')); + +describe('combineTools function', () => { + const toolsPath = path.join(__dirname, '../', 'fixtures', 'tools', 'tools.json'); + const tagsPath = path.join(__dirname, '../', 'fixtures', 'tools', 'tags.json'); + const manualToolsPath = path.join(__dirname, '../', 'fixtures', 'tools', 'manual-tools.json'); + const automatedToolsPath = path.join(__dirname, '../', 'fixtures', 'tools', 'automated-tools.json'); + + let manualTools; + let automatedTools; + let consoleErrorMock; + + beforeAll(() => { + manualTools = readJSON(manualToolsPath); + automatedTools = readJSON(automatedToolsPath); + }); + + afterAll(() => { + if (fs.existsSync(toolsPath)) fs.unlinkSync(toolsPath); + if (fs.existsSync(tagsPath)) fs.unlinkSync(tagsPath); + + consoleErrorMock.mockRestore(); + }); + + beforeEach(() => { + consoleErrorMock = jest.spyOn(console, 'error').mockImplementation(() => { }); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should combine tools and create correct JSON files', async () => { + await combineTools(automatedTools, manualTools, toolsPath, tagsPath); + + const combinedTools = readJSON(toolsPath); + expect(combinedTools).toHaveProperty('category1'); + + const tagsData = readJSON(tagsPath); + expect(tagsData).toHaveProperty('languages'); + expect(tagsData).toHaveProperty('technologies'); + expect(tagsData).toEqual(expectedDataT1) + }); + + it('should handle tools with missing language or technology', async () => { + await combineTools({}, manualToolsWithMissingData, toolsPath, tagsPath); + + const combinedTools = readJSON(toolsPath); + expect(combinedTools).toHaveProperty('category1'); + }); + + it('should sort tools alphabetically by title', async () => { + await combineTools(manualToolsToSort, {}, toolsPath, tagsPath); + + const combinedTools = readJSON(toolsPath); + const toolTitles = combinedTools.category1.toolsList.map(tool => tool.title); + expect(toolTitles).toEqual(['Tool A', 'Tool Z']); + }); + + it('should log validation errors to console.error', async () => { + await combineTools(automatedToolsT4, manualToolsT4, toolsPath, tagsPath); + + const { message, tool, source, note } = console.error.mock.calls[0][0]; + + expect(message).toBe('Tool validation failed'); + expect(tool).toBe('Invalid Tool'); + expect(source).toBe('manual-tools.json'); + expect(note).toBe('Script continues execution, error logged for investigation'); + + expect(fs.existsSync(toolsPath)).toBe(true); + expect(fs.existsSync(tagsPath)).toBe(true); + }); + + it('should handle tools with multiple languages, including new ones', async () => { + await combineTools(automatedToolsT5, {}, toolsPath, tagsPath); + + const combinedTools = readJSON(toolsPath); + const tool = combinedTools.category1.toolsList[0]; + + expect(tool.filters.language).toHaveLength(3); + expect(tool.filters.language).toContainEqual(expect.objectContaining({ name: 'JavaScript' })); + expect(tool.filters.language).toContainEqual(expect.objectContaining({ name: 'Python' })); + expect(tool.filters.language).toContainEqual(expect.objectContaining({ name: 'NewLanguage' })); + + const tagsData = readJSON(tagsPath); + expect(tagsData.languages).toContainEqual(expect.objectContaining({ name: 'NewLanguage' })); + }); + + it('should add a new language and technology when not found in the existing lists', async () => { + await combineTools(automatedToolsT6, {}, toolsPath, tagsPath); + + const combinedTools = readJSON(toolsPath); + const tool = combinedTools.category1.toolsList[0]; + + expect(tool.filters.language).toHaveLength(1); + expect(tool.filters.language).toContainEqual(expect.objectContaining({ name: 'NewLanguage' })); + + expect(tool.filters.technology).toHaveLength(1); + expect(tool.filters.technology).toContainEqual(expect.objectContaining({ name: 'NewTechnology' })); + + const tagsData = readJSON(tagsPath); + expect(tagsData.languages).toContainEqual({ + name: 'NewLanguage', + color: 'bg-[#57f281]', + borderColor: 'border-[#37f069]' + }); + expect(tagsData.technologies).toContainEqual({ + name: 'NewTechnology', + color: 'bg-[#61d0f2]', + borderColor: 'border-[#40ccf7]' + }); + }); + + it('should add a new language when it is not found in the existing languages list', async () => { + await combineTools(automatedToolsT7, {}, toolsPath, tagsPath); + + const combinedTools = readJSON(toolsPath); + const tool = combinedTools.category1.toolsList[0]; + + expect(tool.filters.language).toHaveLength(1); + expect(tool.filters.language).toContainEqual(expect.objectContaining({ name: 'Go' })); + + const tagsData = readJSON(tagsPath); + expect(tagsData.languages).toContainEqual({ + name: 'Go', + color: 'bg-[#57f281]', + borderColor: 'border-[#37f069]' + }); + }); + + it('should handle valid tool objects', async () => { + await combineTools(automatedToolsT8, manualToolsT8, toolsPath, tagsPath); + + const tagsData = readJSON(tagsPath); + expect(tagsData.languages).toContainEqual({ + name: 'JavaScript', + color: 'bg-[#57f281]', + borderColor: 'border-[#37f069]' + }); + expect(tagsData.technologies).toContainEqual({ + name: 'Node.js', + color: 'bg-[#61d0f2]', + borderColor: 'border-[#40ccf7]' + }); + }); + + it('should handle tool objects without repoUrl', async () => { + await combineTools(automatedToolsT9, manualToolsT9, toolsPath, tagsPath); + + const combinedTools = readJSON(toolsPath); + const tool = combinedTools.category1.toolsList[0]; + + expect(tool.isAsyncAPIrepo).toBeUndefined(); + }); + + it('should throw an error when fs.writeFileSync fails', async () => { + const invalidPath = 'this/is/not/valid'; + await expect(combineTools(automatedTools, manualTools, invalidPath, invalidPath)) + .rejects.toThrow(/ENOENT|EACCES/); + }); + + it('should throw an error when there is an invalid category', async () => { + await expect(combineTools(invalidAutomatedToolsT10, manualTools, toolsPath, tagsPath)) + .rejects.toThrow('Error combining tools'); + }); + + it('should throw an error when URL parsing fails', async () => { + await expect(combineTools(automatedTools, manualToolsWithInvalidURLT11, toolsPath, tagsPath)) + .rejects.toThrow('Invalid URL'); + }); + + it('should handle errors when processing tools with circular references', async () => { + circularTool.circular = circularTool; + await expect(combineTools(automatedToolsT12, {}, toolsPath, tagsPath)) + .rejects.toThrow('Converting circular structure to JSON'); + }); + +}); diff --git a/tests/tools/tools-object.test.js b/tests/tools/tools-object.test.js new file mode 100644 index 000000000000..2577a2a27d94 --- /dev/null +++ b/tests/tools/tools-object.test.js @@ -0,0 +1,161 @@ +const axios = require('axios'); +const { convertTools, createToolObject } = require('../../scripts/tools/tools-object'); +const { + createToolFileContent, + createExpectedToolObject, + createMockData, + createMalformedYAML +} = require('../helper/toolsObjectData'); + +jest.mock('axios'); +jest.mock('../../scripts/tools/categorylist', () => ({ + categoryList: [ + { name: 'Category1', tag: 'Category1', description: 'Description for Category1' }, + { name: 'Others', tag: 'Others', description: 'Other tools category' }, + ] +})); + +describe('Tools Object', () => { + beforeEach(() => { + axios.get.mockClear(); + console.error = jest.fn(); + }); + + const mockToolData = (toolContent, toolNames = ['valid-tool']) => { + const mockData = createMockData(toolNames.map((name) => ({ name: `.asyncapi-tool-${name}`, repoName: name }))); + axios.get.mockResolvedValue({ data: toolContent }); + return mockData; + }; + + it('should create a tool object with provided parameters', async () => { + const toolFile = createToolFileContent({ + title: 'Test Tool', + description: 'Test Description', + hasCommercial: true, + additionalLinks: { docsUrl: 'https://docs.example.com' } + }); + + const expected = createExpectedToolObject({ + title: 'Test Tool', + description: 'Test Description', + hasCommercial: true, + additionalLinks: { docsUrl: 'https://docs.example.com' } + }); + + const result = await createToolObject( + toolFile, + expected.links.repoUrl, + 'Repository Description', + true + ); + + expect(result).toEqual(expected); + }); + + it('should convert tools data correctly', async () => { + const toolContent = createToolFileContent({ title: 'Valid Tool', categories: ['Category1'] }); + const mockData = mockToolData(toolContent); + + const result = await convertTools(mockData); + + expect(result.Category1.toolsList).toHaveLength(1); + expect(result.Category1.toolsList[0].title).toBe('Valid Tool'); + }); + + it('should assign tool to Others category if no matching category is found', async () => { + const toolContent = createToolFileContent({ title: 'Unknown Category Tool', categories: ['UnknownCategory'] }); + const mockData = mockToolData(toolContent); + + const result = await convertTools(mockData); + + expect(result.Others.toolsList).toHaveLength(1); + expect(result.Others.toolsList[0].title).toBe('Unknown Category Tool'); + }); + + it('should log errors for invalid .asyncapi-tool file', async () => { + const invalidContent = createToolFileContent({ + title: 'Invalid Tool', + additionalFilters: { invalidField: true } + }); + const mockData = mockToolData(invalidContent); + + await convertTools(mockData); + + expect(console.error).toHaveBeenCalledWith(expect.stringContaining('Script is not failing')); + expect(console.error).toHaveBeenCalledWith(expect.stringContaining('Invalid .asyncapi-tool file')); + }); + + it('should add duplicate tool objects to the same category', async () => { + const toolContent = createToolFileContent({ + title: 'Duplicate Tool', + categories: ['Category1'] + }); + + const mockData = createMockData([ + { name: '.asyncapi-tool-dup1', repoName: 'dup1' }, + { name: '.asyncapi-tool-dup2', repoName: 'dup2' } + ]); + + axios.get.mockResolvedValue({ data: toolContent }); + + const result = await convertTools(mockData); + + expect(result.Category1.toolsList).toHaveLength(2); + expect(result.Category1.toolsList[0].title).toBe('Duplicate Tool'); + expect(result.Category1.toolsList[1].title).toBe('Duplicate Tool'); + }); + + it('should add tool to Others category only once', async () => { + const toolContent = createToolFileContent({ + title: 'Duplicate Tool in Others', + categories: ['UnknownCategory'] + }); + + const mockData = mockToolData(toolContent); + + const result = await convertTools(mockData); + + expect(result.Others.toolsList).toHaveLength(1); + expect(result.Others.toolsList[0].title).toBe('Duplicate Tool in Others'); + }); + + it('should throw an error if axios.get fails', async () => { + const mockData = createMockData([{ + name: '.asyncapi-tool-error', + repoName: 'error-tool' + }]); + + axios.get.mockRejectedValue(new Error('Network Error')); + + await expect(convertTools(mockData)).rejects.toThrow('Network Error'); + }); + + it('should handle malformed JSON in tool file', async () => { + const malformedContent = createMalformedYAML(); + await expect(convertTools(malformedContent)).rejects.toThrow(); + }); + + it('should use repository description when tool description is missing', async () => { + const toolFile = createToolFileContent({ + title: 'No Description Tool', + description: '', + }); + + const repositoryDescription = 'Fallback Repository Description'; + const mockData = createMockData([{ + name: '.asyncapi-tool-no-description', + repoName: 'no-description', + description: repositoryDescription + }]); + + axios.get.mockResolvedValue({ data: toolFile }); + + const result = await convertTools(mockData); + + const toolObject = result.Category1.toolsList[0]; + + expect(toolObject.description).toBe(repositoryDescription); + expect(toolObject.title).toBe('No Description Tool'); + }); + +});