diff --git a/.all-contributorsrc b/.all-contributorsrc
index 64e7fe6bdf7d..8f3a49ee524f 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -555,6 +555,15 @@
"contributions": [
"doc"
]
+ },
+ {
+ "login": "raj17ce",
+ "name": "Raj Patel",
+ "avatar_url": "https://avatars.githubusercontent.com/u/116947399?v=4",
+ "profile": "https://github.com/raj17ce",
+ "contributions": [
+ "code"
+ ]
}
],
"contributorsPerLine": 7,
diff --git a/README.md b/README.md
index 5eab72063aa1..2422bd1b2aec 100644
--- a/README.md
+++ b/README.md
@@ -134,6 +134,24 @@ After cloning repository to your local, perform the following steps from the roo
Now you're running AsyncAPI website in a development mode. Container is mapped with your local copy of the website. Whenever you make changes to the code, the website will refresh and changes visible in localhost:3000.
+## Use shared Markdown fragments
+
+To minimize the duplication of content and make it easier to maintain, there are shared fragments you can use when working with Markdown files. These fragments are stored in the `/assets/docs/fragments` directory.
+
+To include a fragment in a Markdown file:
+
+1. Import the fragment at the top of the file (but below the frontmatter) using the following syntax:
+
+ ```md
+ import DesiredFragmentName from '@/assets/docs/fragments/fragmentYouWantToImport.md';
+ ```
+
+1. Add the imported fragment to the desired location in the Markdown file using the following syntax:
+
+ ```md
+
+ ```
+
## Lint the code
To lint the code, run the following command:
```
@@ -377,6 +395,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
diff --git a/assets/docs/fragments/contribution-notes.md b/assets/docs/fragments/contribution-notes.md
new file mode 100644
index 000000000000..5c10d80c480f
--- /dev/null
+++ b/assets/docs/fragments/contribution-notes.md
@@ -0,0 +1,14 @@
+Code isn't the only way to contribute to OSS; Dev Docs are a **huge** help that benefit the entire OSS ecosystem. At AsyncAPI, we value Doc contributions as much as every other type of contribution. ❤️
+
+To get started as a Docs contributor:
+
+1. Familiarize yourself with our [project's Contribution Guide](https://github.com/asyncapi/community/blob/master/CONTRIBUTING.md) and our [Code of Conduct](https://github.com/asyncapi/.github/blob/master/CODE_OF_CONDUCT.md).
+2. Head over to our [AsyncAPI Docs Board](https://github.com/orgs/asyncapi/projects/12).
+3. Pick an issue you would like to contribute to and leave a comment introducing yourself. This is also the perfect place to leave any questions you may have on how to get started.
+4. If there is no work done in that Docs issue yet, feel free to open a PR and get started!
+
+### Docs contributor questions
+
+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) 🐙.
diff --git a/assets/docs/fragments/how-to-contribute.md b/assets/docs/fragments/how-to-contribute.md
index 932347021a1c..1f3711096e3d 100644
--- a/assets/docs/fragments/how-to-contribute.md
+++ b/assets/docs/fragments/how-to-contribute.md
@@ -1,23 +1,10 @@
-## How to contribute to AsyncAPI Docs
-
-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. At AsyncAPI, we value Doc contributions as much as every other type of contribution. ❤️
-
-To get started as a Docs contributor:
-
-1. Familiarize yourself with our [project's Contribution Guide](https://github.com/asyncapi/community/blob/master/CONTRIBUTING.md) and our [Code of Conduct](https://github.com/asyncapi/.github/blob/master/CODE_OF_CONDUCT.md).
-
-2. Head over to our Docs GH Board [here](https://github.com/orgs/asyncapi/projects/12).
+import ContributionNotes from '@/assets/docs/fragments/contribution-notes.md';
+import TalkToMe from '@/assets/docs/fragments/talk-to-me.md';
-3. Pick an issue you would like to contribute to and leave a comment introducing yourself. This is also the perfect place to leave any questions you may have on how to get started.
-
-4. If there is no work done in that Docs issue yet, feel free to open a PR and get started!
-
-### Tag me in your AsyncAPI Doc PRs
-
-Do you have a documentation contributor question and you're wondering how to tag me into a GitHub discussion or PR? Never fear!
+## How to contribute to AsyncAPI Docs
-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) 🐙.
+Did you know that you can contribute Docs to AsyncAPI as well?
+
### Talk to me
-
-I want and need to listen 👂🏽 to all of your perspectives and ideas. Please don't be shy to express to me what you think needs to be documented first or what is missing. 📝 There's a lot of good work ahead, but **you** determine _our content roadmap_ because the OSS community needs should always come first.✨
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/docs/fragments/talk-to-me.md b/assets/docs/fragments/talk-to-me.md
new file mode 100644
index 000000000000..c1066a563f1a
--- /dev/null
+++ b/assets/docs/fragments/talk-to-me.md
@@ -0,0 +1 @@
+I want and need to listen 👂🏽 to all of your perspectives and ideas. Please don't be shy to express to me what you think needs to be documented first or what is missing. 📝 There's a lot of good work ahead, but **you** determine _our content roadmap_ because the OSS community needs should always come first.✨
diff --git a/components/AlgoliaSearch.tsx b/components/AlgoliaSearch.tsx
index 43b3cc7ce6b9..a7d3604fafb7 100644
--- a/components/AlgoliaSearch.tsx
+++ b/components/AlgoliaSearch.tsx
@@ -5,7 +5,7 @@ import clsx from 'clsx';
import Head from 'next/head';
import Link from 'next/link';
import { useRouter } from 'next/router';
-import { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react';
+import React, { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react';
import { createPortal } from 'react-dom';
export const INDEX_NAME = 'asyncapi';
@@ -283,6 +283,7 @@ export default function AlgoliaSearch({ children }: { children: React.ReactNode
*/
export function SearchButton({ children, indexName = INDEX_NAME, ...props }: ISearchButtonProps) {
const { onOpen, onInput } = useContext(SearchContext);
+ const [Children, setChildren] = useState('');
const searchButtonRef = useRef(null);
const actionKey = getActionKey();
@@ -308,6 +309,12 @@ export function SearchButton({ children, indexName = INDEX_NAME, ...props }: ISe
};
}, [onInput, searchButtonRef]);
+ useEffect(() => {
+ if (typeof children === 'function') {
+ setChildren(children({ actionKey }));
+ }
+ }, []);
+
return (
);
}
diff --git a/components/Avatar.tsx b/components/Avatar.tsx
index b8bb1e557153..d889cafb9d7c 100644
--- a/components/Avatar.tsx
+++ b/components/Avatar.tsx
@@ -32,9 +32,17 @@ export default function Avatar({ name, photo, link, className }: AvatarProps) {
);
return link ? (
-
+
+
) : (
{avatar}
);
diff --git a/components/Calendar.tsx b/components/Calendar.tsx
index 2805abf2f7cd..767f29648809 100644
--- a/components/Calendar.tsx
+++ b/components/Calendar.tsx
@@ -1,4 +1,5 @@
import moment from 'moment';
+import React from 'react';
import { twMerge } from 'tailwind-merge';
import type { IEvent } from '@/types/event';
diff --git a/components/CaseStudyCard.tsx b/components/CaseStudyCard.tsx
index 241e9b5aa84b..7b6bad8dadb2 100644
--- a/components/CaseStudyCard.tsx
+++ b/components/CaseStudyCard.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import type { ICaseStudies } from '@/types/post';
import { ParagraphTypeStyle } from '@/types/typography/Paragraph';
diff --git a/components/CaseTOC.tsx b/components/CaseTOC.tsx
index 6008a6ea1562..e242c6af579c 100644
--- a/components/CaseTOC.tsx
+++ b/components/CaseTOC.tsx
@@ -1,4 +1,4 @@
-import { useMemo, useState } from 'react';
+import React, { useMemo, useState } from 'react';
import { twMerge } from 'tailwind-merge';
import { useHeadingsObserver } from './helpers/useHeadingsObserver';
diff --git a/components/ClickableLogo.tsx b/components/ClickableLogo.tsx
index e40e7fa488c2..98836011e1fa 100644
--- a/components/ClickableLogo.tsx
+++ b/components/ClickableLogo.tsx
@@ -1,4 +1,5 @@
import Link from 'next/link';
+import React from 'react';
import AsyncAPILogo from './logos/AsyncAPILogo';
diff --git a/components/DemoAnimation.tsx b/components/DemoAnimation.tsx
index 0e8affd76280..1748d0c6ca2b 100644
--- a/components/DemoAnimation.tsx
+++ b/components/DemoAnimation.tsx
@@ -1,4 +1,4 @@
-import { useEffect, useState } from 'react';
+import React, { useEffect, useState } from 'react';
import Typing from 'react-typist-component';
import { HeadingLevel, HeadingTypeStyle } from '@/types/typography/Heading';
diff --git a/components/Feedback.tsx b/components/Feedback.tsx
index 6fad56ecb206..104e21107f0f 100644
--- a/components/Feedback.tsx
+++ b/components/Feedback.tsx
@@ -1,5 +1,5 @@
import { useRouter } from 'next/router';
-import { useEffect, useState } from 'react';
+import React, { useEffect, useState } from 'react';
import GitHubIssue from './buttons/GitHubIssue';
diff --git a/components/Figure.tsx b/components/Figure.tsx
index 878258ce7755..c20a92884c3d 100644
--- a/components/Figure.tsx
+++ b/components/Figure.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { Float } from '@/types/components/FigurePropsType';
import Caption from './Caption';
diff --git a/components/FinancialSummary/AsyncAPISummary.tsx b/components/FinancialSummary/AsyncAPISummary.tsx
index 280a24b476f8..7ee80d54dbfa 100644
--- a/components/FinancialSummary/AsyncAPISummary.tsx
+++ b/components/FinancialSummary/AsyncAPISummary.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { HeadingLevel, HeadingTypeStyle } from '@/types/typography/Heading';
import { ParagraphTypeStyle } from '@/types/typography/Paragraph';
diff --git a/components/FinancialSummary/Card.tsx b/components/FinancialSummary/Card.tsx
index 7e46e272733b..44c9a00ca555 100644
--- a/components/FinancialSummary/Card.tsx
+++ b/components/FinancialSummary/Card.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import type { ExpenseItem, Expenses } from '@/types/FinancialSummary/BarChartComponent';
import ExpensesLinkData from '../../config/finance/json-data/ExpensesLink.json';
diff --git a/components/FinancialSummary/ContactUs.tsx b/components/FinancialSummary/ContactUs.tsx
index 738631f8e8fc..1e0dd9560d3e 100644
--- a/components/FinancialSummary/ContactUs.tsx
+++ b/components/FinancialSummary/ContactUs.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { HeadingLevel, HeadingTypeStyle } from '@/types/typography/Heading';
import { ParagraphTypeStyle } from '@/types/typography/Paragraph';
diff --git a/components/FinancialSummary/CustomTooltip.tsx b/components/FinancialSummary/CustomTooltip.tsx
index fa23aa5e69ed..f4ae6afe1172 100644
--- a/components/FinancialSummary/CustomTooltip.tsx
+++ b/components/FinancialSummary/CustomTooltip.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import type { CustomTooltipProps } from '@/types/FinancialSummary/BarChartComponent';
/**
diff --git a/components/FinancialSummary/ExpenseBreakdown.tsx b/components/FinancialSummary/ExpenseBreakdown.tsx
index 89ceaff56f72..d0566968820e 100644
--- a/components/FinancialSummary/ExpenseBreakdown.tsx
+++ b/components/FinancialSummary/ExpenseBreakdown.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { ParagraphTypeStyle } from '@/types/typography/Paragraph';
import { expenseData } from '../data/ExpenseBreakdownData';
diff --git a/components/FinancialSummary/ExpensesCard.tsx b/components/FinancialSummary/ExpensesCard.tsx
index 86af3e7b1b83..5bf593f96425 100644
--- a/components/FinancialSummary/ExpensesCard.tsx
+++ b/components/FinancialSummary/ExpensesCard.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import type { Expenses } from '@/types/FinancialSummary/BarChartComponent';
import ExpensesData from '../../config/finance/json-data/Expenses.json';
diff --git a/components/FinancialSummary/OtherFormsComponent.tsx b/components/FinancialSummary/OtherFormsComponent.tsx
index d3132dc931a0..2c52e7775fc9 100644
--- a/components/FinancialSummary/OtherFormsComponent.tsx
+++ b/components/FinancialSummary/OtherFormsComponent.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { ParagraphTypeStyle } from '@/types/typography/Paragraph';
import { otherFormsData } from '../data/otherFormsData';
diff --git a/components/FinancialSummary/SponsorshipTiers.tsx b/components/FinancialSummary/SponsorshipTiers.tsx
index 42464c7f9e6b..082fc22e5a37 100644
--- a/components/FinancialSummary/SponsorshipTiers.tsx
+++ b/components/FinancialSummary/SponsorshipTiers.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { HeadingLevel, HeadingTypeStyle } from '@/types/typography/Heading';
import { ParagraphTypeStyle } from '@/types/typography/Paragraph';
diff --git a/components/FinancialSummary/SuccessStories.tsx b/components/FinancialSummary/SuccessStories.tsx
index 487be9fd1a39..2ffdd960b003 100644
--- a/components/FinancialSummary/SuccessStories.tsx
+++ b/components/FinancialSummary/SuccessStories.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { successStories } from '../data/successStoriesData';
/**
diff --git a/components/GeneratorInstallation.tsx b/components/GeneratorInstallation.tsx
index 713e819198e8..bf4d937f802f 100644
--- a/components/GeneratorInstallation.tsx
+++ b/components/GeneratorInstallation.tsx
@@ -1,4 +1,4 @@
-import { useState } from 'react';
+import React, { useState } from 'react';
import { ParagraphTypeStyle } from '@/types/typography/Paragraph';
diff --git a/components/Hero.tsx b/components/Hero.tsx
index 6ce5289e085a..c0609e837569 100644
--- a/components/Hero.tsx
+++ b/components/Hero.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { HeadingLevel, HeadingTypeStyle } from '@/types/typography/Heading';
import { ParagraphTypeStyle } from '@/types/typography/Paragraph';
diff --git a/components/InlineHelp.tsx b/components/InlineHelp.tsx
index ec8d039da2a1..0db3fd87f441 100644
--- a/components/InlineHelp.tsx
+++ b/components/InlineHelp.tsx
@@ -1,4 +1,4 @@
-import { useEffect, useState } from 'react';
+import React, { useEffect, useState } from 'react';
import { registerClickAway } from './helpers/click-away';
import QuestionMark from './icons/QuestionMark';
diff --git a/components/InputBox.stories.tsx b/components/InputBox.stories.tsx
index f30247a7b83b..78edb891d6fb 100644
--- a/components/InputBox.stories.tsx
+++ b/components/InputBox.stories.tsx
@@ -1,5 +1,6 @@
import { useArgs } from '@storybook/preview-api';
import type { Meta, StoryObj } from '@storybook/react';
+import React from 'react';
import type { InputBoxProps } from '@/types/components/InputBoxPropsType';
import { InputTypes } from '@/types/components/InputBoxPropsType';
diff --git a/components/Loader.stories.tsx b/components/Loader.stories.tsx
index 85d97ee88674..563f1ed81e79 100644
--- a/components/Loader.stories.tsx
+++ b/components/Loader.stories.tsx
@@ -1,4 +1,5 @@
import type { Meta, StoryObj } from '@storybook/react';
+import React from 'react';
import AsyncAPIColorIcon from '@/components/icons/AsyncAPIColorIcon';
import IconCircularLoader from '@/components/icons/CircularLoader';
diff --git a/components/Loader.tsx b/components/Loader.tsx
index 94fd29417659..b0be9da34750 100644
--- a/components/Loader.tsx
+++ b/components/Loader.tsx
@@ -1,6 +1,8 @@
import React from 'react';
import { twMerge } from 'tailwind-merge';
+import AsyncAPIColorIcon from './icons/AsyncAPIColorIcon';
+
interface LoaderProps {
// eslint-disable-next-line prettier/prettier
@@ -25,7 +27,7 @@ interface LoaderProps {
*/
export default function Loader({
loaderText = '',
- loaderIcon = null,
+ loaderIcon = ,
className = '',
dark = false,
pulsating = false
diff --git a/components/MDX/MDX.tsx b/components/MDX/MDX.tsx
index f9846fd6ec86..32bdb94f9783 100644
--- a/components/MDX/MDX.tsx
+++ b/components/MDX/MDX.tsx
@@ -1,7 +1,7 @@
import { MDXProvider as CoreMDXProvider } from '@mdx-js/react';
import mermaid from 'mermaid';
import Link from 'next/link';
-import { useLayoutEffect, useState } from 'react';
+import React, { useLayoutEffect, useState } from 'react';
import {
TwitterDMButton,
TwitterFollowButton,
diff --git a/components/MacWindow.tsx b/components/MacWindow.tsx
index 5b419add92c1..9deb60ae7e08 100644
--- a/components/MacWindow.tsx
+++ b/components/MacWindow.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
interface IMacWindowProps {
className?: string;
contentClassName?: string;
diff --git a/components/Meeting.tsx b/components/Meeting.tsx
index fe2816fbd742..41bb90dd0fb4 100644
--- a/components/Meeting.tsx
+++ b/components/Meeting.tsx
@@ -1,4 +1,5 @@
import { ArrowRightIcon } from '@heroicons/react/outline';
+import React from 'react';
import { ParagraphTypeStyle } from '@/types/typography/Paragraph';
diff --git a/components/Modal.tsx b/components/Modal.tsx
index ddaefd84ea70..95763029607f 100644
--- a/components/Modal.tsx
+++ b/components/Modal.tsx
@@ -1,4 +1,4 @@
-import { useEffect, useRef } from 'react';
+import React, { useEffect, useRef } from 'react';
interface IModalProps {
title: string;
diff --git a/components/NewsletterSubscribe.tsx b/components/NewsletterSubscribe.tsx
index b4bad37ed2d6..9b4a983bc69b 100644
--- a/components/NewsletterSubscribe.tsx
+++ b/components/NewsletterSubscribe.tsx
@@ -1,5 +1,5 @@
import { useTranslation } from 'next-i18next';
-import { useState } from 'react';
+import React, { useState } from 'react';
import IconCircularLoader from '@/components/icons/CircularLoader';
import { ButtonType } from '@/types/components/buttons/ButtonPropsType';
diff --git a/components/Profiles.tsx b/components/Profiles.tsx
index aeb1f567bd5e..bfe0b6cbaa7d 100644
--- a/components/Profiles.tsx
+++ b/components/Profiles.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
type Profile = {
name: string;
link: string;
diff --git a/components/Remember.tsx b/components/Remember.tsx
index 2f61af39d0ee..04a0ae5d090f 100644
--- a/components/Remember.tsx
+++ b/components/Remember.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import LightBulb from './icons/LightBulb';
interface RememberProps {
diff --git a/components/SupportUs/SupportUs.tsx b/components/SupportUs/SupportUs.tsx
index 9eb62242097e..399fb0ca5dc8 100644
--- a/components/SupportUs/SupportUs.tsx
+++ b/components/SupportUs/SupportUs.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { items } from './SupportItemsList';
interface SupportUsProps {
diff --git a/components/TOC.tsx b/components/TOC.tsx
index 89667a72468b..43819f0257ed 100644
--- a/components/TOC.tsx
+++ b/components/TOC.tsx
@@ -1,4 +1,4 @@
-import { useState } from 'react';
+import React, { useState } from 'react';
import Scrollspy from 'react-scrollspy';
import { twMerge } from 'tailwind-merge';
diff --git a/components/Testimonial.tsx b/components/Testimonial.tsx
index 5d25a769fc05..b8a2d5abce27 100644
--- a/components/Testimonial.tsx
+++ b/components/Testimonial.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import IconQuote from './icons/Quote';
import Paragraph from './typography/Paragraph';
diff --git a/components/Warning.tsx b/components/Warning.tsx
index dceff8014d59..3a937e86abca 100644
--- a/components/Warning.tsx
+++ b/components/Warning.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import IconExclamation from './icons/Exclamation';
interface WarningProps {
diff --git a/components/buttons/Button.stories.tsx b/components/buttons/Button.stories.tsx
index a38eb40977f7..72d5af2c23aa 100644
--- a/components/buttons/Button.stories.tsx
+++ b/components/buttons/Button.stories.tsx
@@ -1,4 +1,5 @@
import type { Meta, StoryObj } from '@storybook/react';
+import React from 'react';
import { ButtonIconPosition, ButtonSize, ButtonType } from '@/types/components/buttons/ButtonPropsType';
diff --git a/components/buttons/Button.tsx b/components/buttons/Button.tsx
index 2b4a30412c33..e19093238ebc 100644
--- a/components/buttons/Button.tsx
+++ b/components/buttons/Button.tsx
@@ -1,4 +1,5 @@
import Link from 'next/link';
+import React from 'react';
import { twMerge } from 'tailwind-merge';
import { ButtonIconPosition, ButtonSize, ButtonType } from '@/types/components/buttons/ButtonPropsType';
diff --git a/components/buttons/ChapterSuggestion.tsx b/components/buttons/ChapterSuggestion.tsx
index 1addc113fe5a..a2d59880adaa 100644
--- a/components/buttons/ChapterSuggestion.tsx
+++ b/components/buttons/ChapterSuggestion.tsx
@@ -1,5 +1,6 @@
import Link from 'next/link';
import type { HTMLAttributeAnchorTarget } from 'react';
+import React from 'react';
import type { Url } from 'url';
import IconArrowRight from '../icons/ArrowRight';
diff --git a/components/buttons/ChapterSuggestions.tsx b/components/buttons/ChapterSuggestions.tsx
index 2986418271ab..3d6d7eb5a025 100644
--- a/components/buttons/ChapterSuggestions.tsx
+++ b/components/buttons/ChapterSuggestions.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import type { IChapterSuggestionProps } from './ChapterSuggestion';
import ChapterSuggestion from './ChapterSuggestion';
diff --git a/components/buttons/DocsButton.tsx b/components/buttons/DocsButton.tsx
index b56a353312c3..16f12205379a 100644
--- a/components/buttons/DocsButton.tsx
+++ b/components/buttons/DocsButton.tsx
@@ -1,4 +1,5 @@
import Link from 'next/link';
+import React from 'react';
import type { IDocs } from '@/types/post';
diff --git a/components/buttons/GithubButton.tsx b/components/buttons/GithubButton.tsx
index 571972d08694..43e11e6b11d5 100644
--- a/components/buttons/GithubButton.tsx
+++ b/components/buttons/GithubButton.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { ButtonIconPosition, ButtonSize } from '@/types/components/buttons/ButtonPropsType';
import type { IButtonDefaultProps } from '../../types/components/buttons/types';
diff --git a/components/buttons/GoogleCalendarButton.tsx b/components/buttons/GoogleCalendarButton.tsx
index 114b60fb4505..15f16dca65f7 100644
--- a/components/buttons/GoogleCalendarButton.tsx
+++ b/components/buttons/GoogleCalendarButton.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { ButtonIconPosition } from '@/types/components/buttons/ButtonPropsType';
import type { IButtonDefaultProps } from '../../types/components/buttons/types';
diff --git a/components/buttons/ICSFileButton.tsx b/components/buttons/ICSFileButton.tsx
index ad03fac4d13f..1f529cee3c10 100644
--- a/components/buttons/ICSFileButton.tsx
+++ b/components/buttons/ICSFileButton.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { ButtonIconPosition } from '@/types/components/buttons/ButtonPropsType';
import type { IButtonDefaultProps } from '../../types/components/buttons/types';
diff --git a/components/buttons/OpenInStudioButton.tsx b/components/buttons/OpenInStudioButton.tsx
index 55b8c3612156..7ffef59baf0a 100644
--- a/components/buttons/OpenInStudioButton.tsx
+++ b/components/buttons/OpenInStudioButton.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import IconRocket from '../icons/Rocket';
import Button from './Button';
diff --git a/components/buttons/SlackButton.tsx b/components/buttons/SlackButton.tsx
index e30a87c27223..b69b7b292160 100644
--- a/components/buttons/SlackButton.tsx
+++ b/components/buttons/SlackButton.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { ButtonIconPosition } from '@/types/components/buttons/ButtonPropsType';
import type { IButtonDefaultProps } from '../../types/components/buttons/types';
diff --git a/components/buttons/SubscribeButton.tsx b/components/buttons/SubscribeButton.tsx
index 225088aceb45..b78bb44f3b81 100644
--- a/components/buttons/SubscribeButton.tsx
+++ b/components/buttons/SubscribeButton.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { ButtonIconPosition } from '@/types/components/buttons/ButtonPropsType';
import type { IButtonDefaultProps } from '../../types/components/buttons/types';
diff --git a/components/buttons/YoutubeButton.tsx b/components/buttons/YoutubeButton.tsx
index f48d4ac11848..4ca4ab331655 100644
--- a/components/buttons/YoutubeButton.tsx
+++ b/components/buttons/YoutubeButton.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { ButtonIconPosition } from '@/types/components/buttons/ButtonPropsType';
import type { IButtonDefaultProps } from '../../types/components/buttons/types';
diff --git a/components/campaigns/AnnouncementHero.tsx b/components/campaigns/AnnouncementHero.tsx
index 1f84cb48c5ec..61ffb47b85eb 100644
--- a/components/campaigns/AnnouncementHero.tsx
+++ b/components/campaigns/AnnouncementHero.tsx
@@ -1,4 +1,4 @@
-import { useEffect, useState } from 'react';
+import React, { useEffect, useState } from 'react';
import ArrowLeft from '../icons/ArrowLeft';
import ArrowRight from '../icons/ArrowRight';
diff --git a/components/community/Hero.tsx b/components/community/Hero.tsx
index 5dea5c49ba09..59957e084ca9 100644
--- a/components/community/Hero.tsx
+++ b/components/community/Hero.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import orbitData from '../../config/orbitData.json';
import Header from './Header';
diff --git a/components/dashboard/Button.tsx b/components/dashboard/Button.tsx
index a5927e98edf4..ba6bb691c346 100644
--- a/components/dashboard/Button.tsx
+++ b/components/dashboard/Button.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
interface ButtonProps {
text: string;
onClick: (event: React.MouseEvent) => void;
diff --git a/components/dashboard/GoodFirstIssues.tsx b/components/dashboard/GoodFirstIssues.tsx
index dccc6a8c48c4..29cec9a3a911 100644
--- a/components/dashboard/GoodFirstIssues.tsx
+++ b/components/dashboard/GoodFirstIssues.tsx
@@ -1,4 +1,4 @@
-import { useState } from 'react';
+import React, { useState } from 'react';
import type { Issue } from '@/types/components/dashboard/TableTypes';
diff --git a/components/dashboard/GoodFirstIssuesTip.tsx b/components/dashboard/GoodFirstIssuesTip.tsx
index af732f506421..4a8a2197160a 100644
--- a/components/dashboard/GoodFirstIssuesTip.tsx
+++ b/components/dashboard/GoodFirstIssuesTip.tsx
@@ -1,5 +1,5 @@
import { useFloating } from '@floating-ui/react-dom-interactions';
-import { useState } from 'react';
+import React, { useState } from 'react';
/**
* @description A tooltip that appears when the user hovers over the Good First Issues icon.
diff --git a/components/dashboard/Header.tsx b/components/dashboard/Header.tsx
index e80f13966705..03b3e2b6b741 100644
--- a/components/dashboard/Header.tsx
+++ b/components/dashboard/Header.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import Button from '../buttons/Button';
import GithubButton from '../buttons/GithubButton';
import SlackButton from '../buttons/SlackButton';
diff --git a/components/dashboard/table/Filters.tsx b/components/dashboard/table/Filters.tsx
index 54f659e62b63..e9d8a9066c4d 100644
--- a/components/dashboard/table/Filters.tsx
+++ b/components/dashboard/table/Filters.tsx
@@ -1,6 +1,6 @@
import { useFloating } from '@floating-ui/react-dom-interactions';
import type { RefObject } from 'react';
-import { useEffect, useRef, useState } from 'react';
+import React, { useEffect, useRef, useState } from 'react';
import type { Issue } from '@/types/components/dashboard/TableTypes';
diff --git a/components/dashboard/table/Row.tsx b/components/dashboard/table/Row.tsx
index 03cd73300e34..8b03be87263c 100644
--- a/components/dashboard/table/Row.tsx
+++ b/components/dashboard/table/Row.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import type { Issue } from '@/types/components/dashboard/TableTypes';
interface RowProps {
@@ -14,47 +16,52 @@ export default function Row({ item }: RowProps) {
return (
-
+
{post.authors
.map((author, index) =>
author.link ? (
- {
- e.stopPropagation();
+ e.preventDefault();
+
+ // Handle the click event, e.g., navigate to author.link
+ window.open(author.link, '_blank');
}}
- target='_blank'
- rel='noreferrer'
>
{author.name}
-
+
) : (
author.name
)
)
- .reduce((prev, curr) => (
- <>
+ .reduce((prev, curr, index) => (
+
{prev} & {curr}
- >
+
))}
diff --git a/components/navigation/CommunityPanel.tsx b/components/navigation/CommunityPanel.tsx
index 82306db1284a..2a6f0fd451b7 100644
--- a/components/navigation/CommunityPanel.tsx
+++ b/components/navigation/CommunityPanel.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import communityItems from './communityItems';
import FlyoutMenu from './FlyoutMenu';
diff --git a/components/navigation/DocsNav.tsx b/components/navigation/DocsNav.tsx
index d0ee433b5733..83bf94294f27 100644
--- a/components/navigation/DocsNav.tsx
+++ b/components/navigation/DocsNav.tsx
@@ -1,4 +1,4 @@
-import { useEffect, useState } from 'react';
+import React, { useEffect, useState } from 'react';
import { buckets } from '../data/buckets';
import DocsArrow from '../icons/DocsArrow';
diff --git a/components/navigation/DocsNavItem.tsx b/components/navigation/DocsNavItem.tsx
index 43d4af17a6ff..eadc6f464184 100644
--- a/components/navigation/DocsNavItem.tsx
+++ b/components/navigation/DocsNavItem.tsx
@@ -1,4 +1,5 @@
import Link from 'next/link';
+import React from 'react';
export interface DocsNavItemProps {
title: string;
diff --git a/components/navigation/DocsNavWrapper.tsx b/components/navigation/DocsNavWrapper.tsx
index b7ad00dbcd85..c51f0cb2033e 100644
--- a/components/navigation/DocsNavWrapper.tsx
+++ b/components/navigation/DocsNavWrapper.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import type { IDocsTree, IPost } from '@/types/post';
import { DOCS_INDEX_NAME, SearchButton } from '../AlgoliaSearch';
diff --git a/components/navigation/Filter.tsx b/components/navigation/Filter.tsx
index d7f07c2e3224..7b69f4702931 100644
--- a/components/navigation/Filter.tsx
+++ b/components/navigation/Filter.tsx
@@ -1,5 +1,5 @@
import { useRouter } from 'next/router';
-import { useEffect, useState } from 'react';
+import React, { useEffect, useState } from 'react';
import Select from '../form/Select';
import { applyFilterList, onFilterApply } from '../helpers/applyFilter';
diff --git a/components/navigation/FlyoutMenu.tsx b/components/navigation/FlyoutMenu.tsx
index b6faf8269fe3..fc5ab7d41a4e 100644
--- a/components/navigation/FlyoutMenu.tsx
+++ b/components/navigation/FlyoutMenu.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import type { MenuItem } from './MenuBlocks';
import MenuBlocks from './MenuBlocks';
diff --git a/components/navigation/Label.tsx b/components/navigation/Label.tsx
index 53315b0ea45a..25b8d5e7ef69 100644
--- a/components/navigation/Label.tsx
+++ b/components/navigation/Label.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
enum LabelColor {
Gray = 'gray',
Green = 'green'
diff --git a/components/navigation/LearningPanel.tsx b/components/navigation/LearningPanel.tsx
index 090cc7a16908..a2882b094ea2 100644
--- a/components/navigation/LearningPanel.tsx
+++ b/components/navigation/LearningPanel.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { buckets } from '../data/buckets';
import FlyoutMenu from './FlyoutMenu';
diff --git a/components/navigation/MenuBlocks.tsx b/components/navigation/MenuBlocks.tsx
index 1f239ba8b17e..81548f97ec0c 100644
--- a/components/navigation/MenuBlocks.tsx
+++ b/components/navigation/MenuBlocks.tsx
@@ -1,4 +1,5 @@
import { useRouter } from 'next/router';
+import React from 'react';
import { ParagraphTypeStyle } from '@/types/typography/Paragraph';
diff --git a/components/navigation/MobileNavMenu.tsx b/components/navigation/MobileNavMenu.tsx
index 1c6f57e130f9..8b0ccd740374 100644
--- a/components/navigation/MobileNavMenu.tsx
+++ b/components/navigation/MobileNavMenu.tsx
@@ -1,5 +1,5 @@
import Link from 'next/link';
-import { useState } from 'react';
+import React, { useState } from 'react';
import { SearchButton } from '../AlgoliaSearch';
import NavItemDropdown from '../icons/NavItemDropdown';
diff --git a/components/navigation/NavBar.tsx b/components/navigation/NavBar.tsx
index e76330c41cff..d0fd2ca6fa02 100644
--- a/components/navigation/NavBar.tsx
+++ b/components/navigation/NavBar.tsx
@@ -2,7 +2,7 @@ import Link from 'next/link';
import type { NextRouter } from 'next/router';
import { useRouter } from 'next/router';
import { useTranslation } from 'next-i18next';
-import { useEffect, useState } from 'react';
+import React, { useEffect, useState } from 'react';
import { defaultLanguage, i18nPaths, languages } from '@/utils/i18n';
diff --git a/components/navigation/SubCategoryDocsNav.tsx b/components/navigation/SubCategoryDocsNav.tsx
index 63f3a60337ac..2b72003a582a 100644
--- a/components/navigation/SubCategoryDocsNav.tsx
+++ b/components/navigation/SubCategoryDocsNav.tsx
@@ -1,4 +1,4 @@
-import { useEffect, useState } from 'react';
+import React, { useEffect, useState } from 'react';
import DocsArrow from '../icons/DocsArrow';
import DocsNavItem from './DocsNavItem';
diff --git a/components/navigation/ToolsPanel.tsx b/components/navigation/ToolsPanel.tsx
index 6571bd6d3708..a90c248b2803 100644
--- a/components/navigation/ToolsPanel.tsx
+++ b/components/navigation/ToolsPanel.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import FlyoutMenu from './FlyoutMenu';
import toolingItems from './toolingItems';
diff --git a/components/navigation/TutorialList.tsx b/components/navigation/TutorialList.tsx
index a7cd0b8a790f..f2cfea0d5a23 100644
--- a/components/navigation/TutorialList.tsx
+++ b/components/navigation/TutorialList.tsx
@@ -1,5 +1,5 @@
import Link from 'next/link';
-import { useContext } from 'react';
+import React, { useContext } from 'react';
import type { DocsContextType } from '@/types/context/DocsContext';
import type { IDoc } from '@/types/post';
diff --git a/components/navigation/communityItems.tsx b/components/navigation/communityItems.tsx
index e5df44e22808..aa25ac89a1b3 100644
--- a/components/navigation/communityItems.tsx
+++ b/components/navigation/communityItems.tsx
@@ -1,3 +1,5 @@
+import type React from 'react';
+
import IconAmbassador from '../icons/Ambassador';
import IconContributing from '../icons/Contributing';
import IconDashboard from '../icons/Dashboard';
diff --git a/components/navigation/learningItems.tsx b/components/navigation/learningItems.tsx
index 40e9b0d670e8..d8f538bb8652 100644
--- a/components/navigation/learningItems.tsx
+++ b/components/navigation/learningItems.tsx
@@ -1,3 +1,5 @@
+import type React from 'react';
+
import IconGradCap from '../icons/GradCap';
import IconGuide from '../icons/Guide';
import IconMigration from '../icons/Migration';
diff --git a/components/navigation/toolingItems.tsx b/components/navigation/toolingItems.tsx
index 8c18db3bec06..e637a62d0070 100644
--- a/components/navigation/toolingItems.tsx
+++ b/components/navigation/toolingItems.tsx
@@ -1,4 +1,5 @@
import { TerminalIcon } from '@heroicons/react/outline';
+import type React from 'react';
import IconGenerator from '../icons/Generator';
import IconGithubActions from '../icons/GithubActions';
diff --git a/components/newsroom/FeaturedBlogPost.tsx b/components/newsroom/FeaturedBlogPost.tsx
index 515d0d0a2f66..49b4c8ef4ab4 100644
--- a/components/newsroom/FeaturedBlogPost.tsx
+++ b/components/newsroom/FeaturedBlogPost.tsx
@@ -1,5 +1,6 @@
import moment from 'moment';
import Link from 'next/link';
+import React from 'react';
import TextTruncate from 'react-text-truncate';
import { BlogPostType } from '@/types/components/navigation/BlogPostType';
@@ -87,18 +88,9 @@ export default function FeaturedBlogPost({ post, className = '' }: FeaturedBlogP
{post.authors
.map((author, index) =>
author.link ? (
- {
- e.stopPropagation();
- }}
- target='_blank'
- rel='noreferrer'
- >
+
{author.name}
-
+
) : (
author.name
)
diff --git a/components/newsroom/Newsroom.tsx b/components/newsroom/Newsroom.tsx
index 649263afaebe..87b8bdff1809 100644
--- a/components/newsroom/Newsroom.tsx
+++ b/components/newsroom/Newsroom.tsx
@@ -1,3 +1,4 @@
+import React from 'react';
import { TwitterTimelineEmbed } from 'react-twitter-embed';
import { HeadingLevel, HeadingTypeStyle } from '@/types/typography/Heading';
diff --git a/components/newsroom/NewsroomBlogPosts.tsx b/components/newsroom/NewsroomBlogPosts.tsx
index c5036b126995..7e79c1fb5342 100644
--- a/components/newsroom/NewsroomBlogPosts.tsx
+++ b/components/newsroom/NewsroomBlogPosts.tsx
@@ -1,4 +1,4 @@
-import { useState } from 'react';
+import React, { useState } from 'react';
import { A11y, Navigation } from 'swiper/modules';
import { Swiper, SwiperSlide } from 'swiper/react';
diff --git a/components/newsroom/NewsroomSection.tsx b/components/newsroom/NewsroomSection.tsx
index c3a3e7df1cd7..7e660e69dfe4 100644
--- a/components/newsroom/NewsroomSection.tsx
+++ b/components/newsroom/NewsroomSection.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { HeadingLevel, HeadingTypeStyle } from '@/types/typography/Heading';
import { ParagraphTypeStyle } from '@/types/typography/Paragraph';
diff --git a/components/newsroom/NewsroomYoutube.tsx b/components/newsroom/NewsroomYoutube.tsx
index 91015b937883..ced5fceedbe2 100644
--- a/components/newsroom/NewsroomYoutube.tsx
+++ b/components/newsroom/NewsroomYoutube.tsx
@@ -1,4 +1,4 @@
-import { useState } from 'react';
+import React, { useState } from 'react';
import { A11y, Navigation } from 'swiper/modules';
import { Swiper, SwiperSlide } from 'swiper/react';
diff --git a/components/newsroom/swiper.tsx b/components/newsroom/swiper.tsx
index 1118cc36e8f4..4f040cbeca6c 100644
--- a/components/newsroom/swiper.tsx
+++ b/components/newsroom/swiper.tsx
@@ -1,3 +1,4 @@
+import type React from 'react';
import { useEffect, useRef, useState } from 'react';
/**
diff --git a/components/roadmap/RoadmapItem.tsx b/components/roadmap/RoadmapItem.tsx
index e82504eae658..34787b7252e6 100644
--- a/components/roadmap/RoadmapItem.tsx
+++ b/components/roadmap/RoadmapItem.tsx
@@ -1,4 +1,4 @@
-import { useState } from 'react';
+import React, { useState } from 'react';
// Since a roadmap item can contain nested roadmap lists, we need to import RoadmapList to display them.
/* eslint-disable import/no-cycle*/
diff --git a/components/roadmap/RoadmapList.tsx b/components/roadmap/RoadmapList.tsx
index b9ad17296622..57d500978bf4 100644
--- a/components/roadmap/RoadmapList.tsx
+++ b/components/roadmap/RoadmapList.tsx
@@ -1,5 +1,7 @@
// Since a RoadmapList may contain other RoadmapItems, we need to import RoadmapItem to display them.
/* eslint-disable import/no-cycle*/
+import React from 'react';
+
import RoadmapItem from './RoadmapItem';
interface IRoadmapListProps {
diff --git a/components/roadmap/RoadmapPill.tsx b/components/roadmap/RoadmapPill.tsx
index e89b9dba463c..d73ac46e84bf 100644
--- a/components/roadmap/RoadmapPill.tsx
+++ b/components/roadmap/RoadmapPill.tsx
@@ -1,4 +1,4 @@
-import { useState } from 'react';
+import React, { useState } from 'react';
import IconArrowRight from '../icons/ArrowRight';
import Modal from '../Modal';
diff --git a/components/slack/index.tsx b/components/slack/index.tsx
index 70bdef3e739b..5d3b4a17fd64 100644
--- a/components/slack/index.tsx
+++ b/components/slack/index.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import SlackMessage from './Message';
interface SlackProps {
diff --git a/components/sponsors/GoldSponsors.tsx b/components/sponsors/GoldSponsors.tsx
index 277f4332ad33..3729ffcc7e09 100644
--- a/components/sponsors/GoldSponsors.tsx
+++ b/components/sponsors/GoldSponsors.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { goldSponsors } from './GoldSponsorsList';
interface GoldSponsorsProps {
diff --git a/components/sponsors/SilverSponsors.tsx b/components/sponsors/SilverSponsors.tsx
index 62c8868980a6..4a737aef7df9 100644
--- a/components/sponsors/SilverSponsors.tsx
+++ b/components/sponsors/SilverSponsors.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { Silversponsors } from './SilverSponsorsList';
interface SilverSponsorsProps {
diff --git a/components/sponsors/Sponsors.tsx b/components/sponsors/Sponsors.tsx
index af0fed3882e3..fd5aff751179 100644
--- a/components/sponsors/Sponsors.tsx
+++ b/components/sponsors/Sponsors.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { sponsors } from './SponsorsList';
interface SponsorsProps {
diff --git a/components/tools/CategoryDropdown.tsx b/components/tools/CategoryDropdown.tsx
index f865a226021c..02d091008a0f 100644
--- a/components/tools/CategoryDropdown.tsx
+++ b/components/tools/CategoryDropdown.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import type { ToolsListData } from '@/types/components/tools/ToolDataType';
import ToolsDataList from '../../config/tools.json';
diff --git a/components/tools/Checkbox.stories.tsx b/components/tools/Checkbox.stories.tsx
index d9691aff1813..7445b41b4123 100644
--- a/components/tools/Checkbox.stories.tsx
+++ b/components/tools/Checkbox.stories.tsx
@@ -1,5 +1,6 @@
import { useArgs } from '@storybook/preview-api';
import type { Meta, StoryObj } from '@storybook/react';
+import React from 'react';
import type { CheckboxProps } from '@/types/components/tools/CheckboxPropsType';
diff --git a/components/tools/Checkbox.tsx b/components/tools/Checkbox.tsx
index 439bb040be02..25b4bceb2c2a 100644
--- a/components/tools/Checkbox.tsx
+++ b/components/tools/Checkbox.tsx
@@ -1,3 +1,4 @@
+import React from 'react';
import { twMerge } from 'tailwind-merge';
import type { CheckboxProps } from '@/types/components/tools/CheckboxPropsType';
diff --git a/components/tools/Filters.tsx b/components/tools/Filters.tsx
index 0ca822b7eea9..4938828086c6 100644
--- a/components/tools/Filters.tsx
+++ b/components/tools/Filters.tsx
@@ -1,5 +1,5 @@
import { useRouter } from 'next/router';
-import { useContext, useEffect, useState } from 'react';
+import React, { useContext, useEffect, useState } from 'react';
import { twMerge } from 'tailwind-merge';
import type { Language, Technology, VisibleDataListType } from '@/types/components/tools/ToolDataType';
diff --git a/components/tools/FiltersDisplay.tsx b/components/tools/FiltersDisplay.tsx
index 945481cae243..63c34db8dc17 100644
--- a/components/tools/FiltersDisplay.tsx
+++ b/components/tools/FiltersDisplay.tsx
@@ -1,3 +1,4 @@
+import React from 'react';
import { twMerge } from 'tailwind-merge';
interface FiltersDisplayProps {
diff --git a/components/tools/FiltersDropdown.tsx b/components/tools/FiltersDropdown.tsx
index beb68e81eb5a..6c473541e871 100644
--- a/components/tools/FiltersDropdown.tsx
+++ b/components/tools/FiltersDropdown.tsx
@@ -1,3 +1,4 @@
+import React from 'react';
import { twMerge } from 'tailwind-merge';
import type { Category, Language, Technology } from '@/types/components/tools/ToolDataType';
diff --git a/components/tools/Tags.tsx b/components/tools/Tags.tsx
index 7609b2237415..0fd1c2453b2e 100644
--- a/components/tools/Tags.tsx
+++ b/components/tools/Tags.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
interface SelectTagsProps {
// eslint-disable-next-line prettier/prettier
diff --git a/components/tools/Toggle.stories.tsx b/components/tools/Toggle.stories.tsx
index 2fcaf81c26df..5e72492197ea 100644
--- a/components/tools/Toggle.stories.tsx
+++ b/components/tools/Toggle.stories.tsx
@@ -1,5 +1,6 @@
import { useArgs } from '@storybook/preview-api';
import type { Meta, StoryObj } from '@storybook/react';
+import React from 'react';
import type { ToggleProps } from '@/types/components/tools/TogglePropsType';
diff --git a/components/tools/Toggle.tsx b/components/tools/Toggle.tsx
index bfa324b8538b..ee7066e7b900 100644
--- a/components/tools/Toggle.tsx
+++ b/components/tools/Toggle.tsx
@@ -1,3 +1,4 @@
+import React from 'react';
import { twMerge } from 'tailwind-merge';
import type { ToggleProps } from '@/types/components/tools/TogglePropsType';
diff --git a/components/tools/ToolsCard.tsx b/components/tools/ToolsCard.tsx
index b3e73df9364a..2a6d9ced02f0 100644
--- a/components/tools/ToolsCard.tsx
+++ b/components/tools/ToolsCard.tsx
@@ -1,4 +1,4 @@
-import { useEffect, useRef, useState } from 'react';
+import React, { useEffect, useRef, useState } from 'react';
import type { ToolData, VisibleDataListType } from '@/types/components/tools/ToolDataType';
import { HeadingTypeStyle } from '@/types/typography/Heading';
@@ -92,9 +92,12 @@ export default function ToolsCard({ toolData }: ToolsCardProp) {
}, 500)
}
>
-
+
{toolData.description}
-
+
diff --git a/components/tools/ToolsDashboard.tsx b/components/tools/ToolsDashboard.tsx
index 920aaee66eb3..ff9a364c87d4 100644
--- a/components/tools/ToolsDashboard.tsx
+++ b/components/tools/ToolsDashboard.tsx
@@ -1,5 +1,5 @@
import { useRouter } from 'next/router';
-import { createRef, useContext, useEffect, useMemo, useRef, useState } from 'react';
+import React, { createRef, useContext, useEffect, useMemo, useRef, useState } from 'react';
import type { ToolsListData } from '@/types/components/tools/ToolDataType';
diff --git a/components/tools/ToolsList.tsx b/components/tools/ToolsList.tsx
index b6e6eeeafe51..5ce95974d722 100644
--- a/components/tools/ToolsList.tsx
+++ b/components/tools/ToolsList.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import type { ToolsListData } from '@/types/components/tools/ToolDataType';
import { HeadingTypeStyle } from '@/types/typography/Heading';
import { ParagraphTypeStyle } from '@/types/typography/Paragraph';
diff --git a/components/typography/Paragraph.tsx b/components/typography/Paragraph.tsx
index 261a83d96f49..17f8eadcce88 100644
--- a/components/typography/Paragraph.tsx
+++ b/components/typography/Paragraph.tsx
@@ -1,3 +1,4 @@
+import React from 'react';
import { twMerge } from 'tailwind-merge';
import { ParagraphTypeStyle } from '@/types/typography/Paragraph';
diff --git a/components/typography/TextLink.tsx b/components/typography/TextLink.tsx
index 4b789ba9e0d7..c8f2bb4a6281 100644
--- a/components/typography/TextLink.tsx
+++ b/components/typography/TextLink.tsx
@@ -1,4 +1,5 @@
import Link from 'next/link';
+import React from 'react';
import { twMerge } from 'tailwind-merge';
export interface TextLinkProps {
diff --git a/config/MAINTAINERS.json b/config/MAINTAINERS.json
index 465d80cba814..d5914331c17f 100644
--- a/config/MAINTAINERS.json
+++ b/config/MAINTAINERS.json
@@ -189,8 +189,6 @@
"generator",
"parser-js",
"converter-js",
- "ts-nats-template",
- "dotnet-nats-template",
"generator-react-sdk",
"modelina",
"simulator",
@@ -260,7 +258,6 @@
"website",
"spec-json-schemas",
"generator",
- "asyncapi-react",
"extensions-catalog",
"bindings",
"enterprise-patterns",
@@ -301,8 +298,6 @@
"html-template",
"markdown-template",
"github-action-for-cli",
- "ts-nats-template",
- "dotnet-nats-template",
"template-for-generator-templates",
"generator-react-sdk",
"modelina",
@@ -325,6 +320,7 @@
"availableForHire": false,
"isTscMember": true,
"repos": [
+ "asyncapi-react",
"conference-website",
"chatbot"
],
diff --git a/config/all-tags.json b/config/all-tags.json
index b8274f82abbd..bcbe78efc37c 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":"Java","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"HTML","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}]}
\ No newline at end of file
diff --git a/config/tools-automated.json b/config/tools-automated.json
index 366603414892..a48496cf7dd4 100644
--- a/config/tools-automated.json
+++ b/config/tools-automated.json
@@ -72,19 +72,22 @@
}
},
{
- "title": "nestjs-asyncapi",
- "description": "Utilize decorators to generate AsyncAPI document utilizing DTOs (similar to @nestjs/swagger) and a web UI.",
+ "title": "Zod Sockets",
+ "description": "Socket.IO solution with I/O validation and the ability to generate AsyncAPI specification and a contract for consumers.",
"links": {
- "repoUrl": "https://github.com/flamewow/nestjs-asyncapi"
+ "websiteUrl": "https://www.npmjs.com/package/zod-sockets",
+ "repoUrl": "https://github.com/RobinTail/zod-sockets"
},
"filters": {
- "language": "Typescript",
+ "language": "TypeScript",
"technology": [
"Node.js",
- "NestJS"
+ "TypeScript"
],
"categories": [
- "code-first"
+ "code-first",
+ "dsl",
+ "framework"
],
"hasCommercial": false,
"isAsyncAPIOwner": false
@@ -113,22 +116,19 @@
}
},
{
- "title": "Zod Sockets",
- "description": "Socket.IO solution with I/O validation and the ability to generate AsyncAPI specification and a contract for consumers.",
+ "title": "nestjs-asyncapi",
+ "description": "Utilize decorators to generate AsyncAPI document utilizing DTOs (similar to @nestjs/swagger) and a web UI.",
"links": {
- "websiteUrl": "https://www.npmjs.com/package/zod-sockets",
- "repoUrl": "https://github.com/RobinTail/zod-sockets"
+ "repoUrl": "https://github.com/flamewow/nestjs-asyncapi"
},
"filters": {
- "language": "TypeScript",
+ "language": "Typescript",
"technology": [
"Node.js",
- "TypeScript"
+ "NestJS"
],
"categories": [
- "code-first",
- "dsl",
- "framework"
+ "code-first"
],
"hasCommercial": false,
"isAsyncAPIOwner": false
@@ -154,6 +154,27 @@
"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
+ }
+ },
{
"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
- }
}
]
},
@@ -402,6 +402,23 @@
"hasCommercial": false,
"isAsyncAPIOwner": true
}
+ },
+ {
+ "title": "GitHub Action for Generator",
+ "description": "CLI to work with your AsyncAPI files. You can validate them and in the future use a generator and even bootstrap a new file. Contributions are welcomed!",
+ "links": {
+ "repoUrl": "https://github.com/asyncapi/cli"
+ },
+ "filters": {
+ "technology": [
+ "AsyncAPI Generator"
+ ],
+ "categories": [
+ "github-actions"
+ ],
+ "hasCommercial": false,
+ "isAsyncAPIOwner": true
+ }
}
]
},
@@ -640,18 +657,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"
@@ -661,15 +675,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"
@@ -702,15 +719,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": "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 Spring Cloud Stream Template",
+ "description": "Java Spring Cloud Stream template for the AsyncAPI Generator",
"links": {
- "repoUrl": "https://github.com/asyncapi/nodejs-ws-template"
+ "repoUrl": "https://github.com/asyncapi/java-spring-cloud-stream-template"
},
"filters": {
- "language": "javascript",
+ "language": [
+ "javascript"
+ ],
"technology": [
- "Node.js"
+ "Spring Cloud Streams",
+ "Maven"
],
"categories": [
"generator-template"
@@ -720,18 +740,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"
@@ -741,15 +758,17 @@
}
},
{
- "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 Template",
+ "description": "Java template for the AsyncAPI Generator",
"links": {
- "repoUrl": "https://github.com/asyncapi/html-template"
+ "repoUrl": "https://github.com/asyncapi/java-template"
},
"filters": {
- "language": "javascript",
+ "language": [
+ "javascript"
+ ],
"technology": [
- "HTML"
+ "Java"
],
"categories": [
"generator-template"
@@ -759,10 +778,10 @@
}
},
{
- "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": "Node.js Websockets Template",
+ "description": "Node.js WebSockets template for the AsyncAPI Generator. It showcases how from a single AsyncAPI document you can generate a server and a client at the same time.",
"links": {
- "repoUrl": "https://github.com/asyncapi/nodejs-template"
+ "repoUrl": "https://github.com/asyncapi/nodejs-ws-template"
},
"filters": {
"language": "javascript",
@@ -777,17 +796,15 @@
}
},
{
- "title": "Java Template",
- "description": "Java template for the AsyncAPI Generator",
+ "title": "HTML Template",
+ "description": "HTML template for AsyncAPI Generator. Use it to generate a static docs. It is using AsyncAPI React component under the hood.",
"links": {
- "repoUrl": "https://github.com/asyncapi/java-template"
+ "repoUrl": "https://github.com/asyncapi/html-template"
},
"filters": {
- "language": [
- "javascript"
- ],
+ "language": "javascript",
"technology": [
- "Java"
+ "HTML"
],
"categories": [
"generator-template"
diff --git a/config/tools.json b/config/tools.json
index 052756e16fc1..ccb2d7a5f45f 100644
--- a/config/tools.json
+++ b/config/tools.json
@@ -1 +1 @@
-{"APIs":{"description":"The following is a list of APIs that expose functionality related to AsyncAPI.","toolsList":[{"title":"API Tracker - AsyncAPI specs","description":"Explore APIs and companies with public AsyncAPI specifications.","links":{"websiteUrl":"https://apitracker.io/specifications/asyncapi","repoUrl":""},"filters":{"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI Server API","description":"Server API providing official AsyncAPI tools","links":{"websiteUrl":"https://api.asyncapi.com/v1","docsUrl":"https://api.asyncapi.com/v1/docs","repoUrl":"https://github.com/asyncapi/server-api"},"filters":{"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["api"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"AsyncAPI-Directory by APIs.guru","description":"Directory of asynchronous API specifications in AsyncAPI format.","links":{"websiteUrl":"https://apis.guru/asyncapi-directory/","repoUrl":"https://github.com/APIs-guru/asyncapi-directory"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"SIO-AsyncAPI","description":"This is code-first approach to generate AsyncAPI specification from Socket.IO server.","links":{"websiteUrl":"https://github.com/daler-rahimov/sio-asyncapi","docsUrl":"https://github.com/daler-rahimov/sio-asyncapi","repoUrl":"https://github.com/daler-rahimov/sio-asyncapi"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"technology":[{"name":"Socket.IO","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["code-first","api"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Code-first tools":{"description":"The following is a list of tools that generate AsyncAPI documents from your code.","toolsList":[{"title":"AsyncAPI.Net","description":"The AsyncAPI.NET SDK contains a useful object model for AsyncAPI documents in .NET along with common serializers to extract raw OpenAPI JSON and YAML documents from the model.","links":{"websiteUrl":"https://github.com/LEGO/AsyncAPI.NET/","repoUrl":"https://github.com/LEGO/AsyncAPI.NET"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"}],"categories":["converters","code-first","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncApi.Net.Generator","description":"Code-first AsyncAPI documentation generator and ui","links":{"repoUrl":"https://github.com/yurvon-screamo/asyncapi.net"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"EventBridge Atlas","description":"Tool that translates your AWS EventBridge Schemas into an AsyncAPI document and a web UI.","links":{"websiteUrl":"https://eventbridge-atlas.netlify.app/","repoUrl":"https://github.com/boyney123/eventbridge-atlas"},"filters":{"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"FastStream","description":"A powerful and easy-to-use Python framework for building asynchronous services interacting with event streams such as Apache Kafka, RabbitMQ and NATS.","links":{"websiteUrl":"https://faststream.airt.ai","repoUrl":"https://github.com/airtai/FastStream"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"categories":["code-first","framework"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"Go AsyncAPI","description":"This library helps to create AsyncAPI spec from your Go message structures. It uses reflection to translate Go structures in JSON Schema definitions and arrange them in AsyncAPI schema.","links":{"repoUrl":"https://github.com/swaggest/go-asyncapi"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"Java AsyncAPI","description":"This tool stores modules, which simplifies interacting with AsyncAPI in jvm ecosystem.","links":{"repoUrl":"https://github.com/asyncapi/jasyncapi"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Kotlin","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"KnstEventBus","description":"AsyncApi code-first tools for c#. Generates document and view.","links":{"repoUrl":"https://github.com/d0972058277/KnstEventBus"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"},{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Kotlin AsyncAPI","description":"The Kotlin AsyncAPI project aims to provide convenience tools for generating and serving AsyncAPI documentation. The core of this project is a Kotlin DSL for building the specification in a typesafe way.","links":{"repoUrl":"https://github.com/OpenFolder/kotlin-asyncapi"},"filters":{"language":[{"name":"Kotlin","color":"bg-[#B1ACDF]","borderColor":"border-[#756BD9]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"nestjs-asyncapi","description":"Utilize decorators to generate AsyncAPI document utilizing DTOs (similar to @nestjs/swagger) and a web UI.","links":{"repoUrl":"https://github.com/flamewow/nestjs-asyncapi"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Nest Js","color":"bg-[#E1224E]","borderColor":"border-[#B9012b]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Neuroglia AsyncAPI","description":"A .NET SDK for the Async API specification. Automatically generates and serves AsyncAPI documents based on your code. Includes fluent-builders to create AsyncAPI documents from scratch, and provides a web-based GUI to browse generated documents.","links":{"repoUrl":"https://github.com/neuroglia-io/AsyncApi"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Saunter","description":"Saunter is an AsyncAPI documentation generator for dotnet. Generates (and hosts) an AsyncAPI schema document from your code.","links":{"repoUrl":"https://github.com/tehmantra/saunter"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"SIO-AsyncAPI","description":"This is code-first approach to generate AsyncAPI specification from Socket.IO server.","links":{"websiteUrl":"https://github.com/daler-rahimov/sio-asyncapi","docsUrl":"https://github.com/daler-rahimov/sio-asyncapi","repoUrl":"https://github.com/daler-rahimov/sio-asyncapi"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"technology":[{"name":"Socket.IO","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["code-first","api"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Springwolf","description":"Automated documentation for async APIs built with Spring Boot. Like Springfox for AsyncAPI. Auto-generates an AsyncAPI document and a web UI.","links":{"websiteUrl":"https://www.springwolf.dev","repoUrl":"https://github.com/springwolf/springwolf-core"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"},{"name":"Gradle","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"sttp tapir","description":"Library for describing HTTP endpoints, and then interpreting them as a server, client, or documentation","links":{"websiteUrl":"https://tapir.softwaremill.com/","repoUrl":"https://github.com/softwaremill/tapir"},"filters":{"language":[{"name":"Scala","color":"bg-[#FFA299]","borderColor":"border-[#DF301F]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"Zod Sockets","description":"Socket.IO solution with I/O validation and the ability to generate AsyncAPI specification and a contract for consumers.","links":{"websiteUrl":"https://www.npmjs.com/package/zod-sockets","repoUrl":"https://github.com/RobinTail/zod-sockets"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-first","dsl","framework"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Code Generators":{"description":"The following is a list of tools that generate code from an AsyncAPI document; not the other way around.","toolsList":[{"title":"AsyncAPI Generator","description":"Generator is a tool that you can use to generate whatever you want basing on the AsyncAPI specification file as an input.","links":{"docsUrl":"https://www.asyncapi.com/docs/tools/generator","repoUrl":"https://github.com/asyncapi/generator"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["code-generator","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"AsyncAPI Modelina","description":"Generate payload models into Java, TypeScript, Go, etc, you name it, from AsyncAPI documents. This tool gives you full control over the models through high customization","links":{"websiteUrl":"https://modelina.org","docsUrl":"https://github.com/asyncapi/modelina/tree/master/docs","repoUrl":"https://github.com/asyncapi/modelina"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":"Docker","color":"bg-[#B8E0FF]","borderColor":"border-[#2596ED]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Golang AsyncAPI Code Generator","description":"Generate Go user and application boilerplate from AsyncAPI specifications. Can be called from `go generate` without requirements.\n","links":{"repoUrl":"https://github.com/lerenn/asyncapi-codegen"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"MultiAPI Generator","description":"This is a plugin designed to help developers automatizing the creation of code classes from YML files based on AsyncApi and OpenAPI. It is presented in 2 flavours Maven and Gradle","links":{"repoUrl":"https://github.com/sngular/scs-multiapi-plugin"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Groovy","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Node-RED AsyncAPI plugin","description":"A plugin for generating and configuring nodes for Kafka, MQTT, AMQP, etc. automatically from an AsyncAPI specification.","links":{"repoUrl":"https://github.com/dalelane/node-red-contrib-plugin-asyncapi"},"filters":{"technology":[{"name":"Node-RED","color":"bg-[#FF7474]","borderColor":"border-[#8F0101]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Converters":{"description":"The following is a list of tools that do not yet belong to any specific category but are also useful for the community.","toolsList":[{"title":"AsyncAPI-format","description":"Format an AsyncAPI document by ordering, casing, formatting, and filtering fields.","links":{"repoUrl":"https://github.com/thim81/asyncapi-format"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["converter","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI.Net","description":"The AsyncAPI.NET SDK contains a useful object model for AsyncAPI documents in .NET along with common serializers to extract raw OpenAPI JSON and YAML documents from the model.","links":{"websiteUrl":"https://github.com/LEGO/AsyncAPI.NET/","repoUrl":"https://github.com/LEGO/AsyncAPI.NET"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"}],"categories":["converters","code-first","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Converter","description":"Converts old versions of AsyncAPI files into the latest version.","links":{"repoUrl":"https://github.com/asyncapi/converter-js"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["converter"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Converter-Go","description":"The AsyncAPI Converter converts AsyncAPI documents from versions 1.0.0, 1.1.0 and 1.2.0 to version 2.0.0. It supports both json and yaml formats on input and output. By default, the AsyncAPI Converter converts a document into the json format.","links":{"repoUrl":"https://github.com/asyncapi/converter-go"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["converter"],"hasCommercial":false,"isAsyncAPIOwner":true,"technology":[]}}]},"Directories":{"description":"The following is a list of directories that index public AsyncAPI documents.","toolsList":[{"title":"API Tracker - AsyncAPI specs","description":"Explore APIs and companies with public AsyncAPI specifications.","links":{"websiteUrl":"https://apitracker.io/specifications/asyncapi","repoUrl":""},"filters":{"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI-Directory by APIs.guru","description":"Directory of asynchronous API specifications in AsyncAPI format.","links":{"websiteUrl":"https://apis.guru/asyncapi-directory/","repoUrl":"https://github.com/APIs-guru/asyncapi-directory"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Documentation Generators":{"description":"The following is a list of tools that generate human-readable documentation from an AsyncAPI document.","toolsList":[{"title":"AsyncAPI Generator","description":"Generator is a tool that you can use to generate whatever you want basing on the AsyncAPI specification file as an input.","links":{"docsUrl":"https://www.asyncapi.com/docs/tools/generator","repoUrl":"https://github.com/asyncapi/generator"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Markdown","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"asyncapi-asciidoc-template","description":"Asciidoc template for the asyncapi generator","links":{"repoUrl":"https://gitlab.com/djencks/asyncapi-asciidoc-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"}],"categories":["documentation-generator","generator-template"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Bump.sh","description":"OpenAPI 2 & 3 / AsyncAPI 2 documentation generator, with automatic changelog and visual diff.","links":{"websiteUrl":"https://bump.sh/","docsUrl":"https://docs.bump.sh/help/","repoUrl":""},"filters":{"categories":["documentation-generator"],"hasCommercial":true,"isAsyncAPIOwner":false,"technology":[]}},{"title":"Cupid","description":"A library that focuses on finding and analyzing the relationships between AsyncAPI documents. It outputs a map of the system architecture.","links":{"repoUrl":"https://github.com/asyncapi/cupid"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"KnstEventBus","description":"AsyncApi code-first tools for c#. Generates document and view.","links":{"repoUrl":"https://github.com/d0972058277/KnstEventBus"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"},{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Springwolf","description":"Automated documentation for async APIs built with Spring Boot. Like Springfox for AsyncAPI. Auto-generates an AsyncAPI document and a web UI.","links":{"websiteUrl":"https://www.springwolf.dev","repoUrl":"https://github.com/springwolf/springwolf-core"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"},{"name":"Gradle","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Widdershins","description":"OpenAPI 3.0 / Swagger 2.0 / AsyncAPI 1.0 definition to Slate / Shins compatible markdown.","links":{"websiteUrl":"https://mermade.github.io/reslate/","repoUrl":"https://github.com/Mermade/widdershins"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Shell","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Editors":{"description":"The following is a list of editors or related tools that allow editing of AsyncAPI document.","toolsList":[{"title":"AsyncAPI Studio","description":"Visually design your AsyncAPI files and event-driven architecture.","links":{"websiteUrl":"https://studio.asyncapi.com","repoUrl":"https://github.com/asyncapi/studio"},"filters":{"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["editor"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"UI components":{"description":"The following is a list of UI components to view AsyncAPI documents.","toolsList":[{"title":"Api-Diff-Viewer","description":"React component to view the difference between two Json based API documents. Supported specifications: JsonSchema, OpenAPI 3.x, AsyncAPI 2.x.","links":{"repoUrl":"https://github.com/udamir/api-diff-viewer","websiteUrl":"https://api-diff-viewer.vercel.app/"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":"Babel","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Storybook","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ui-component"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI React component","description":"React component for rendering documentation from your specification in real-time in the browser. It also provides a WebComponent and bundle for Angular and Vue","links":{"repoUrl":"https://github.com/asyncapi/asyncapi-react"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":"WebComponents","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ui-component"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"DSL":{"description":"Writing YAML by hand is no fun, and maybe you don't want a GUI, so use a Domain Specific Language to write AsyncAPI in your language of choice.","toolsList":[{"title":"BOATS","description":"Compile your single AsyncAPI file from multiple YAML files with BOATS and with the help of the template engine Nunjucks, plus a many extra helpers to automate much of the donkey work.","links":{"repoUrl":"https://github.com/j-d-carmichael/boats"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["dsl"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Zod Sockets","description":"Socket.IO solution with I/O validation and the ability to generate AsyncAPI specification and a contract for consumers.","links":{"websiteUrl":"https://www.npmjs.com/package/zod-sockets","repoUrl":"https://github.com/RobinTail/zod-sockets"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-first","dsl","framework"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Frameworks":{"description":"The following is a list of API/application frameworks that make use of AsyncAPI.","toolsList":[{"title":"Asynction","description":"SocketIO server framework driven by the AsyncAPI specification. Asynction guarantees that your API will work in accordance with its AsyncAPI documentation. Built on top of Flask-SocketIO.","links":{"websiteUrl":"https://pypi.org/project/asynction/","repoUrl":"https://github.com/dedoussis/asynction"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"technology":[{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["framework"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"FastStream","description":"A powerful and easy-to-use Python framework for building asynchronous services interacting with event streams such as Apache Kafka, RabbitMQ and NATS.","links":{"websiteUrl":"https://faststream.airt.ai","repoUrl":"https://github.com/airtai/FastStream"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"categories":["code-first","framework"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"Zod Sockets","description":"Socket.IO solution with I/O validation and the ability to generate AsyncAPI specification and a contract for consumers.","links":{"websiteUrl":"https://www.npmjs.com/package/zod-sockets","repoUrl":"https://github.com/RobinTail/zod-sockets"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-first","dsl","framework"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"GitHub Actions":{"description":"The following is a list of GitHub Actions that you can use in your workflows","toolsList":[{"title":"API documentation generation on Bump.sh","description":"With this GitHub Action you can automatically generate your API reference (with the changelog and diff) on Bump.sh from any AsyncAPI file.","links":{"websiteUrl":"https://github.com/marketplace/actions/api-documentation-on-bump","repoUrl":"https://github.com/bump-sh/github-action"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI GitHub Action","description":"This action validates if the AsyncAPI schema file is valid or not.","links":{"websiteUrl":"https://github.com/marketplace/actions/asyncapi-github-action","repoUrl":"https://github.com/WaleedAshraf/asyncapi-github-action"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["github-action","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Automated version bump for AsyncAPI documents","description":"With this GitHub Action, you can automatically bump the version based on commit messages, which is similar to what semantic-release is for NPM.","links":{"websiteUrl":"https://github.com/marketplace/actions/automated-version-bump-for-asyncapi","repoUrl":"https://github.com/bump-sh/github-action"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"GitHub Action for CLI","description":"GitHub Action with generator, validator, converter and others - all in one for your AsyncAPI documents with AsyncAPI CLI as backbone","links":{"repoUrl":"https://github.com/asyncapi/github-action-for-cli"},"filters":{"technology":[{"name":"AsyncAPI Generator","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"GitHub Action for Generator","description":null,"links":{"repoUrl":"https://github.com/actions-marketplace-validations/asyncapi_github-action-for-generator"},"filters":{"technology":[{"name":"AsyncAPI Generator","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Mocking and Testing":{"description":"The tools below take specification documents as input, then publish fake messages to broker destinations for simulation purposes. They may also check that publisher messages are compliant with schemas.","toolsList":[{"title":"Microcks","description":"Mocking and testing platform for API and microservices. Turn your AsyncAPI, OpenAPI contract examples, or Postman collections into ready-to-use mocks. Use examples to simulate and validate received messages according to schema elements.","links":{"websiteUrl":"https://microcks.io/","repoUrl":"https://github.com/microcks/microcks"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Kubernetes-native","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Saas","color":"bg-[#6AB8EC]","borderColor":"border-[#2275AD]"}],"categories":["mocking-and-testing"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"MultiAPI Converter","description":"Use AsyncAPI definition, to generate Spring Cloud Contract producer validation or consumer stubs, using maven.","links":{"repoUrl":"https://github.com/sngular/scc-multiapi-converter"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"}],"categories":["mocking-and-testing"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Specmatic","description":"An API contract testing tool that helps ensure the correctness APIs by automatically generating test cases and verifying them against the API spec. It simplifies the process of testing APIs and reduces the likelihood of bugs and compatibility issues.","links":{"websiteUrl":"https://specmatic.io","docsUrl":"https://specmatic.io/documentation/","repoUrl":"https://github.com/znsio/specmatic"},"filters":{"language":[{"name":"Kotlin","color":"bg-[#B1ACDF]","borderColor":"border-[#756BD9]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["mocking-and-testing"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Virtualan","description":"Mocking and testing platform for API and microservices. Allows you to create and setup mocks for OpenAPI and AsyncAPI contracts. Shows how to setup and create AsyncAPI GitHub Reference Examples and OpenAPI GitHub Reference Examples.","links":{"websiteUrl":"https://www.virtualan.io/index.html","repoUrl":"https://github.com/virtualansoftware"},"filters":{"technology":[{"name":"Kubernetes-native","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["mocking-and-testing"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Validators":{"description":"The following is a list of tools that validate AsyncAPI documents.","toolsList":[{"title":"AMF","description":"AMF (AML Modeling Framework) is an open-source library capable of parsing and validating AML metadata documents.","links":{"docsUrl":"https://a.ml/docs/","repoUrl":"https://github.com/aml-org/amf"},"filters":{"language":[{"name":"Scala","color":"bg-[#FFA299]","borderColor":"border-[#DF301F]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI GitHub Action","description":"This action validates if the AsyncAPI schema file is valid or not.","links":{"websiteUrl":"https://github.com/marketplace/actions/asyncapi-github-action","repoUrl":"https://github.com/WaleedAshraf/asyncapi-github-action"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["github-action","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI Parser","description":"Use this package to parse and validate AsyncAPI documents —either YAML or JSON— in your Node.js or browser application. Updated bundle for the browser is always attached to the GitHub Release.","links":{"repoUrl":"https://github.com/asyncapi/parser-js"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"AsyncAPI Parser","description":"The AsyncAPI Parser validates AsyncAPI documents according to dedicated schemas.","links":{"repoUrl":"https://github.com/asyncapi/parser-go"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":true,"technology":[]}},{"title":"AsyncAPI Parser Wrapper","description":"Use this library to parse and validate AsyncAPI documents — either YAML or JSON — in your Java application. It is a Java wrapper over JavaScript Parser implemented using J2V8.","links":{"repoUrl":"https://github.com/AsyncAPITools/parser-java-wrapper"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI Validation","description":"Message validation package for YAML and JSON AsyncAPI documents.","links":{"repoUrl":"https://github.com/Elhebert/asyncapi-validation"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"asyncapi-validator","description":"It allows you to validate the schema of your messages against your AsyncAPI schema definition. You can use it with Kafka, RabbitMQ or any other messaging/queue.","links":{"repoUrl":"https://github.com/WaleedAshraf/asyncapi-validator"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI.Net","description":"The AsyncAPI.NET SDK contains a useful object model for AsyncAPI documents in .NET along with common serializers to extract raw OpenAPI JSON and YAML documents from the model.","links":{"websiteUrl":"https://github.com/LEGO/AsyncAPI.NET/","repoUrl":"https://github.com/LEGO/AsyncAPI.NET"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"}],"categories":["converters","code-first","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Spectral","description":"A flexible JSON/YAML linter for creating automated style guides, with baked in support for OpenAPI v3.1, v3.0, and v2.0 as well as AsyncAPI v2.x.","links":{"repoUrl":"https://github.com/stoplightio/spectral"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Compare tools":{"description":"The following is a list of tools that compare AsyncAPI documents.","toolsList":[{"title":"Api-Smart-Diff","description":"It allows you to compare two API documents and classify changes. Supported API specifications: OpenAPI, AsyncAPI, JsonSchema.","links":{"repoUrl":"https://github.com/udamir/api-smart-diff"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"categories":["compare-tool"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI Diff","description":"Diff is a library that compares two AsyncAPI Documents and provides information about the differences by pointing out explicitly information like breaking changes.","links":{"repoUrl":"https://github.com/asyncapi/diff"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["compare-tool"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"jasyncapicmp","description":"Tool for comparing two AsyncAPI versions and evaluating compatibility.","links":{"websiteUrl":"https://siom79.github.io/jasyncapicmp/","docsUrl":"https://github.com/siom79/jasyncapicmp","repoUrl":"https://github.com/siom79/jasyncapicmp"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["compare-tool"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"jasyncapicmp","description":"Tool/library/maven-plugin for comparing two AsyncAPI versions and evaluating compatibility.","links":{"websiteUrl":"https://siom79.github.io/jasyncapicmp/","repoUrl":"https://github.com/siom79/jasyncapicmp"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["compare-tool"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"CLIs":{"description":"The following is a list of tools that you can work with in terminal or do some CI/CD automation.","toolsList":[{"title":"AsyncAPI CLI","description":"One CLI to rule them all. \nThis is a CLI that aims to integrate all AsyncAPI tools that you need while AsyncAPI document development and maintainance. \nYou can use it to generate docs or code, validate AsyncAPI document and event create new documents.\n","links":{"websiteUrl":"https://www.asyncapi.com/tools/cli","repoUrl":"https://github.com/asyncapi/cli"},"filters":{"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["others","cli"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"AsyncAPI CLI","description":"One CLI to rule them all. \nThis is a CLI that aims to integrate all AsyncAPI tools that you need while AsyncAPI document development and maintainance. \nYou can use it to generate docs or code, validate AsyncAPI document and event create new documents.\n","links":{"websiteUrl":"https://www.asyncapi.com/tools/cli","repoUrl":"https://github.com/hkirat/asyncapi-fork"},"filters":{"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["others","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI-format","description":"Format an AsyncAPI document by ordering, casing, formatting, and filtering fields.","links":{"repoUrl":"https://github.com/asyncapi/converter-go"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["converter","cli"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Bundlers":{"description":"The following is a list of tools that you can work with to bundle AsyncAPI documents.","toolsList":[{"title":"Api-ref-bundler","description":"It allows you bundle/dereference external/internal $refs in Json based API document. Supported specifications: OpenAPI, AsyncAPI, JsonSchema.","links":{"repoUrl":"https://github.com/udamir/api-ref-bundler"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["bundler"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI Bundler","description":"Combine multiple AsyncAPI specification files into one.","links":{"repoUrl":"https://github.com/asyncapi/bundler"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["bundler"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"IDE Extensions":{"description":"The following is a list of extensions for different IDEs like VSCode, IntelliJ IDEA and others","toolsList":[{"title":"asyncapi-preview","description":"VSCode extension that enables you to:\n - Preview documentation generated using you AsyncAPI document. It uses AsyncAPI React component under the hood,\n - Create AsyncAPI documents faster using SmartPaste functionality\n","links":{"repoUrl":"https://github.com/asyncapi/vs-asyncapi-preview"},"filters":{"technology":[{"name":"VSCode","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"SmartPaste","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ide-extension"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"asyncapi-preview","description":"VSCode extension that enables you to:\n - Preview documentation generated using you AsyncAPI document. It uses AsyncAPI React component under the hood,\n - Create AsyncAPI documents faster using SmartPaste functionality\n","links":{"repoUrl":"https://github.com/Savio629/testing2"},"filters":{"technology":[{"name":"VSCode","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"SmartPaste","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ide-extension"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"jAsyncAPI - IDEA plugin","description":"Idea plugin for the java-asyncapi - Helps to edit and validate AsyncAPI schemas.","links":{"websiteUrl":"https://plugins.jetbrains.com/plugin/15673-asyncapi","docsUrl":"https://github.com/asyncapi/jasyncapi-idea-plugin#usage","repoUrl":"https://github.com/asyncapi/jasyncapi-idea-plugin"},"filters":{"language":[{"name":"Kotlin","color":"bg-[#B1ACDF]","borderColor":"border-[#756BD9]"}],"technology":[{"name":"JetBrains","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"IntelliJ IDEA","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ide-extension"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"AsyncAPI Generator Templates":{"description":"The following is a list of templates compatible with AsyncAPI Generator. You can use them to generate apps, clients or documentation from your AsyncAPI documents.","toolsList":[{"title":"HTML Template","description":"HTML template for AsyncAPI Generator. Use it to generate a static docs. It is using AsyncAPI React component under the hood.","links":{"repoUrl":"https://github.com/asyncapi/html-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"HTML","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Java Spring Cloud Stream Template","description":"Java Spring Cloud Stream template for the AsyncAPI Generator","links":{"repoUrl":"https://github.com/asyncapi/java-spring-cloud-stream-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Java Spring Template","description":"Java Spring template for the AsyncAPI Generator","links":{"repoUrl":"https://github.com/asyncapi/java-spring-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Gradle","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Java Template","description":"Java template for the AsyncAPI Generator","links":{"repoUrl":"https://github.com/asyncapi/java-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Java","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Node.js Multiprotocol Template","description":"This template generates a server using your AsyncAPI document. It supports multiple different protocols, like Kafka or MQTT. It is designed in the way that generated code is a library and with it's API you can start the server, send messages or register a middleware for listening incoming messages. Runtime message validation included.","links":{"repoUrl":"https://github.com/asyncapi/nodejs-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Node.js Websockets Template","description":"Node.js WebSockets template for the AsyncAPI Generator. It showcases how from a single AsyncAPI document you can generate a server and a client at the same time.","links":{"repoUrl":"https://github.com/asyncapi/nodejs-ws-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"Others":{"description":"The following is a list of tools that comes under Other category.","toolsList":[{"title":"AsyncAPI CLI","description":"One CLI to rule them all. \nThis is a CLI that aims to integrate all AsyncAPI tools that you need while AsyncAPI document development and maintainance. \nYou can use it to generate docs or code, validate AsyncAPI document and event create new documents.\n","links":{"websiteUrl":"https://www.asyncapi.com/tools/cli","repoUrl":"https://github.com/asyncapi/cli"},"filters":{"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["others","cli"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"AsyncAPI CLI","description":"One CLI to rule them all. \nThis is a CLI that aims to integrate all AsyncAPI tools that you need while AsyncAPI document development and maintainance. \nYou can use it to generate docs or code, validate AsyncAPI document and event create new documents.\n","links":{"websiteUrl":"https://www.asyncapi.com/tools/cli","repoUrl":"https://github.com/hkirat/asyncapi-fork"},"filters":{"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["others","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]}}
\ No newline at end of file
+{"APIs":{"description":"The following is a list of APIs that expose functionality related to AsyncAPI.","toolsList":[{"title":"API Tracker - AsyncAPI specs","description":"Explore APIs and companies with public AsyncAPI specifications.","links":{"websiteUrl":"https://apitracker.io/specifications/asyncapi","repoUrl":""},"filters":{"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI Server API","description":"Server API providing official AsyncAPI tools","links":{"websiteUrl":"https://api.asyncapi.com/v1","docsUrl":"https://api.asyncapi.com/v1/docs","repoUrl":"https://github.com/asyncapi/server-api"},"filters":{"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["api"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"AsyncAPI-Directory by APIs.guru","description":"Directory of asynchronous API specifications in AsyncAPI format.","links":{"websiteUrl":"https://apis.guru/asyncapi-directory/","repoUrl":"https://github.com/APIs-guru/asyncapi-directory"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"SIO-AsyncAPI","description":"This is code-first approach to generate AsyncAPI specification from Socket.IO server.","links":{"websiteUrl":"https://github.com/daler-rahimov/sio-asyncapi","docsUrl":"https://github.com/daler-rahimov/sio-asyncapi","repoUrl":"https://github.com/daler-rahimov/sio-asyncapi"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"technology":[{"name":"Socket.IO","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["code-first","api"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Code-first tools":{"description":"The following is a list of tools that generate AsyncAPI documents from your code.","toolsList":[{"title":"AsyncAPI.Net","description":"The AsyncAPI.NET SDK contains a useful object model for AsyncAPI documents in .NET along with common serializers to extract raw OpenAPI JSON and YAML documents from the model.","links":{"websiteUrl":"https://github.com/LEGO/AsyncAPI.NET/","repoUrl":"https://github.com/LEGO/AsyncAPI.NET"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"}],"categories":["converters","code-first","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncApi.Net.Generator","description":"Code-first AsyncAPI documentation generator and ui","links":{"repoUrl":"https://github.com/yurvon-screamo/asyncapi.net"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"EventBridge Atlas","description":"Tool that translates your AWS EventBridge Schemas into an AsyncAPI document and a web UI.","links":{"websiteUrl":"https://eventbridge-atlas.netlify.app/","repoUrl":"https://github.com/boyney123/eventbridge-atlas"},"filters":{"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"FastStream","description":"A powerful and easy-to-use Python framework for building asynchronous services interacting with event streams such as Apache Kafka, RabbitMQ and NATS.","links":{"websiteUrl":"https://faststream.airt.ai","repoUrl":"https://github.com/airtai/FastStream"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"categories":["code-first","framework"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"Go AsyncAPI","description":"This library helps to create AsyncAPI spec from your Go message structures. It uses reflection to translate Go structures in JSON Schema definitions and arrange them in AsyncAPI schema.","links":{"repoUrl":"https://github.com/swaggest/go-asyncapi"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"Java AsyncAPI","description":"This tool stores modules, which simplifies interacting with AsyncAPI in jvm ecosystem.","links":{"repoUrl":"https://github.com/asyncapi/jasyncapi"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Kotlin","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"KnstEventBus","description":"AsyncApi code-first tools for c#. Generates document and view.","links":{"repoUrl":"https://github.com/d0972058277/KnstEventBus"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"},{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Kotlin AsyncAPI","description":"The Kotlin AsyncAPI project aims to provide convenience tools for generating and serving AsyncAPI documentation. The core of this project is a Kotlin DSL for building the specification in a typesafe way.","links":{"repoUrl":"https://github.com/OpenFolder/kotlin-asyncapi"},"filters":{"language":[{"name":"Kotlin","color":"bg-[#B1ACDF]","borderColor":"border-[#756BD9]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"nestjs-asyncapi","description":"Utilize decorators to generate AsyncAPI document utilizing DTOs (similar to @nestjs/swagger) and a web UI.","links":{"repoUrl":"https://github.com/flamewow/nestjs-asyncapi"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Nest Js","color":"bg-[#E1224E]","borderColor":"border-[#B9012b]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Neuroglia AsyncAPI","description":"A .NET SDK for the Async API specification. Automatically generates and serves AsyncAPI documents based on your code. Includes fluent-builders to create AsyncAPI documents from scratch, and provides a web-based GUI to browse generated documents.","links":{"repoUrl":"https://github.com/neuroglia-io/AsyncApi"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Saunter","description":"Saunter is an AsyncAPI documentation generator for dotnet. Generates (and hosts) an AsyncAPI schema document from your code.","links":{"repoUrl":"https://github.com/tehmantra/saunter"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"SIO-AsyncAPI","description":"This is code-first approach to generate AsyncAPI specification from Socket.IO server.","links":{"websiteUrl":"https://github.com/daler-rahimov/sio-asyncapi","docsUrl":"https://github.com/daler-rahimov/sio-asyncapi","repoUrl":"https://github.com/daler-rahimov/sio-asyncapi"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"technology":[{"name":"Socket.IO","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["code-first","api"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Springwolf","description":"Automated documentation for async APIs built with Spring Boot. Like Springfox for AsyncAPI. Auto-generates an AsyncAPI document and a web UI.","links":{"websiteUrl":"https://www.springwolf.dev","repoUrl":"https://github.com/springwolf/springwolf-core"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"},{"name":"Gradle","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"sttp tapir","description":"Library for describing HTTP endpoints, and then interpreting them as a server, client, or documentation","links":{"websiteUrl":"https://tapir.softwaremill.com/","repoUrl":"https://github.com/softwaremill/tapir"},"filters":{"language":[{"name":"Scala","color":"bg-[#FFA299]","borderColor":"border-[#DF301F]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"Zod Sockets","description":"Socket.IO solution with I/O validation and the ability to generate AsyncAPI specification and a contract for consumers.","links":{"websiteUrl":"https://www.npmjs.com/package/zod-sockets","repoUrl":"https://github.com/RobinTail/zod-sockets"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-first","dsl","framework"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Code Generators":{"description":"The following is a list of tools that generate code from an AsyncAPI document; not the other way around.","toolsList":[{"title":"AsyncAPI Generator","description":"Generator is a tool that you can use to generate whatever you want basing on the AsyncAPI specification file as an input.","links":{"docsUrl":"https://www.asyncapi.com/docs/tools/generator","repoUrl":"https://github.com/asyncapi/generator"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["code-generator","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"AsyncAPI Modelina","description":"Generate payload models into Java, TypeScript, Go, etc, you name it, from AsyncAPI documents. This tool gives you full control over the models through high customization","links":{"websiteUrl":"https://modelina.org","docsUrl":"https://github.com/asyncapi/modelina/tree/master/docs","repoUrl":"https://github.com/asyncapi/modelina"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":"Docker","color":"bg-[#B8E0FF]","borderColor":"border-[#2596ED]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Golang AsyncAPI Code Generator","description":"Generate Go user and application boilerplate from AsyncAPI specifications. Can be called from `go generate` without requirements.\n","links":{"repoUrl":"https://github.com/lerenn/asyncapi-codegen"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"MultiAPI Generator","description":"This is a plugin designed to help developers automatizing the creation of code classes from YML files based on AsyncApi and OpenAPI. It is presented in 2 flavours Maven and Gradle","links":{"repoUrl":"https://github.com/sngular/scs-multiapi-plugin"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Groovy","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Node-RED AsyncAPI plugin","description":"A plugin for generating and configuring nodes for Kafka, MQTT, AMQP, etc. automatically from an AsyncAPI specification.","links":{"repoUrl":"https://github.com/dalelane/node-red-contrib-plugin-asyncapi"},"filters":{"technology":[{"name":"Node-RED","color":"bg-[#FF7474]","borderColor":"border-[#8F0101]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Converters":{"description":"The following is a list of tools that do not yet belong to any specific category but are also useful for the community.","toolsList":[{"title":"AsyncAPI-format","description":"Format an AsyncAPI document by ordering, casing, formatting, and filtering fields.","links":{"repoUrl":"https://github.com/thim81/asyncapi-format"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["converter","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI.Net","description":"The AsyncAPI.NET SDK contains a useful object model for AsyncAPI documents in .NET along with common serializers to extract raw OpenAPI JSON and YAML documents from the model.","links":{"websiteUrl":"https://github.com/LEGO/AsyncAPI.NET/","repoUrl":"https://github.com/LEGO/AsyncAPI.NET"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"}],"categories":["converters","code-first","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Converter","description":"Converts old versions of AsyncAPI files into the latest version.","links":{"repoUrl":"https://github.com/asyncapi/converter-js"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["converter"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Converter-Go","description":"The AsyncAPI Converter converts AsyncAPI documents from versions 1.0.0, 1.1.0 and 1.2.0 to version 2.0.0. It supports both json and yaml formats on input and output. By default, the AsyncAPI Converter converts a document into the json format.","links":{"repoUrl":"https://github.com/asyncapi/converter-go"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["converter"],"hasCommercial":false,"isAsyncAPIOwner":true,"technology":[]}}]},"Directories":{"description":"The following is a list of directories that index public AsyncAPI documents.","toolsList":[{"title":"API Tracker - AsyncAPI specs","description":"Explore APIs and companies with public AsyncAPI specifications.","links":{"websiteUrl":"https://apitracker.io/specifications/asyncapi","repoUrl":""},"filters":{"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI-Directory by APIs.guru","description":"Directory of asynchronous API specifications in AsyncAPI format.","links":{"websiteUrl":"https://apis.guru/asyncapi-directory/","repoUrl":"https://github.com/APIs-guru/asyncapi-directory"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Documentation Generators":{"description":"The following is a list of tools that generate human-readable documentation from an AsyncAPI document.","toolsList":[{"title":"AsyncAPI Generator","description":"Generator is a tool that you can use to generate whatever you want basing on the AsyncAPI specification file as an input.","links":{"docsUrl":"https://www.asyncapi.com/docs/tools/generator","repoUrl":"https://github.com/asyncapi/generator"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Markdown","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"asyncapi-asciidoc-template","description":"Asciidoc template for the asyncapi generator","links":{"repoUrl":"https://gitlab.com/djencks/asyncapi-asciidoc-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"}],"categories":["documentation-generator","generator-template"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Bump.sh","description":"OpenAPI 2 & 3 / AsyncAPI 2 documentation generator, with automatic changelog and visual diff.","links":{"websiteUrl":"https://bump.sh/","docsUrl":"https://docs.bump.sh/help/","repoUrl":""},"filters":{"categories":["documentation-generator"],"hasCommercial":true,"isAsyncAPIOwner":false,"technology":[]}},{"title":"Cupid","description":"A library that focuses on finding and analyzing the relationships between AsyncAPI documents. It outputs a map of the system architecture.","links":{"repoUrl":"https://github.com/asyncapi/cupid"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"KnstEventBus","description":"AsyncApi code-first tools for c#. Generates document and view.","links":{"repoUrl":"https://github.com/d0972058277/KnstEventBus"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"},{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Springwolf","description":"Automated documentation for async APIs built with Spring Boot. Like Springfox for AsyncAPI. Auto-generates an AsyncAPI document and a web UI.","links":{"websiteUrl":"https://www.springwolf.dev","repoUrl":"https://github.com/springwolf/springwolf-core"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"},{"name":"Gradle","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Widdershins","description":"OpenAPI 3.0 / Swagger 2.0 / AsyncAPI 1.0 definition to Slate / Shins compatible markdown.","links":{"websiteUrl":"https://mermade.github.io/reslate/","repoUrl":"https://github.com/Mermade/widdershins"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Shell","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Editors":{"description":"The following is a list of editors or related tools that allow editing of AsyncAPI document.","toolsList":[{"title":"AsyncAPI Studio","description":"Visually design your AsyncAPI files and event-driven architecture.","links":{"websiteUrl":"https://studio.asyncapi.com","repoUrl":"https://github.com/asyncapi/studio"},"filters":{"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["editor"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"UI components":{"description":"The following is a list of UI components to view AsyncAPI documents.","toolsList":[{"title":"Api-Diff-Viewer","description":"React component to view the difference between two Json based API documents. Supported specifications: JsonSchema, OpenAPI 3.x, AsyncAPI 2.x.","links":{"repoUrl":"https://github.com/udamir/api-diff-viewer","websiteUrl":"https://api-diff-viewer.vercel.app/"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":"Babel","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Storybook","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ui-component"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI React component","description":"React component for rendering documentation from your specification in real-time in the browser. It also provides a WebComponent and bundle for Angular and Vue","links":{"repoUrl":"https://github.com/asyncapi/asyncapi-react"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":"WebComponents","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ui-component"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"DSL":{"description":"Writing YAML by hand is no fun, and maybe you don't want a GUI, so use a Domain Specific Language to write AsyncAPI in your language of choice.","toolsList":[{"title":"BOATS","description":"Compile your single AsyncAPI file from multiple YAML files with BOATS and with the help of the template engine Nunjucks, plus a many extra helpers to automate much of the donkey work.","links":{"repoUrl":"https://github.com/j-d-carmichael/boats"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["dsl"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Zod Sockets","description":"Socket.IO solution with I/O validation and the ability to generate AsyncAPI specification and a contract for consumers.","links":{"websiteUrl":"https://www.npmjs.com/package/zod-sockets","repoUrl":"https://github.com/RobinTail/zod-sockets"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-first","dsl","framework"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Frameworks":{"description":"The following is a list of API/application frameworks that make use of AsyncAPI.","toolsList":[{"title":"Asynction","description":"SocketIO server framework driven by the AsyncAPI specification. Asynction guarantees that your API will work in accordance with its AsyncAPI documentation. Built on top of Flask-SocketIO.","links":{"websiteUrl":"https://pypi.org/project/asynction/","repoUrl":"https://github.com/dedoussis/asynction"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"technology":[{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["framework"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"FastStream","description":"A powerful and easy-to-use Python framework for building asynchronous services interacting with event streams such as Apache Kafka, RabbitMQ and NATS.","links":{"websiteUrl":"https://faststream.airt.ai","repoUrl":"https://github.com/airtai/FastStream"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"categories":["code-first","framework"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"Zod Sockets","description":"Socket.IO solution with I/O validation and the ability to generate AsyncAPI specification and a contract for consumers.","links":{"websiteUrl":"https://www.npmjs.com/package/zod-sockets","repoUrl":"https://github.com/RobinTail/zod-sockets"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-first","dsl","framework"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"GitHub Actions":{"description":"The following is a list of GitHub Actions that you can use in your workflows","toolsList":[{"title":"API documentation generation on Bump.sh","description":"With this GitHub Action you can automatically generate your API reference (with the changelog and diff) on Bump.sh from any AsyncAPI file.","links":{"websiteUrl":"https://github.com/marketplace/actions/api-documentation-on-bump","repoUrl":"https://github.com/bump-sh/github-action"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI GitHub Action","description":"This action validates if the AsyncAPI schema file is valid or not.","links":{"websiteUrl":"https://github.com/marketplace/actions/asyncapi-github-action","repoUrl":"https://github.com/WaleedAshraf/asyncapi-github-action"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["github-action","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Automated version bump for AsyncAPI documents","description":"With this GitHub Action, you can automatically bump the version based on commit messages, which is similar to what semantic-release is for NPM.","links":{"websiteUrl":"https://github.com/marketplace/actions/automated-version-bump-for-asyncapi","repoUrl":"https://github.com/bump-sh/github-action"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"GitHub Action for CLI","description":"GitHub Action with generator, validator, converter and others - all in one for your AsyncAPI documents with AsyncAPI CLI as backbone","links":{"repoUrl":"https://github.com/asyncapi/github-action-for-cli"},"filters":{"technology":[{"name":"AsyncAPI Generator","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"GitHub Action for Generator","description":null,"links":{"repoUrl":"https://github.com/actions-marketplace-validations/asyncapi_github-action-for-generator"},"filters":{"technology":[{"name":"AsyncAPI Generator","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"GitHub Action for Generator","description":"CLI to work with your AsyncAPI files. You can validate them and in the future use a generator and even bootstrap a new file. Contributions are welcomed!","links":{"repoUrl":"https://github.com/asyncapi/cli"},"filters":{"technology":[{"name":"AsyncAPI Generator","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["github-actions"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"Mocking and Testing":{"description":"The tools below take specification documents as input, then publish fake messages to broker destinations for simulation purposes. They may also check that publisher messages are compliant with schemas.","toolsList":[{"title":"Microcks","description":"Mocking and testing platform for API and microservices. Turn your AsyncAPI, OpenAPI contract examples, or Postman collections into ready-to-use mocks. Use examples to simulate and validate received messages according to schema elements.","links":{"websiteUrl":"https://microcks.io/","repoUrl":"https://github.com/microcks/microcks"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Kubernetes-native","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Saas","color":"bg-[#6AB8EC]","borderColor":"border-[#2275AD]"}],"categories":["mocking-and-testing"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"MultiAPI Converter","description":"Use AsyncAPI definition, to generate Spring Cloud Contract producer validation or consumer stubs, using maven.","links":{"repoUrl":"https://github.com/sngular/scc-multiapi-converter"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"}],"categories":["mocking-and-testing"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Specmatic","description":"An API contract testing tool that helps ensure the correctness APIs by automatically generating test cases and verifying them against the API spec. It simplifies the process of testing APIs and reduces the likelihood of bugs and compatibility issues.","links":{"websiteUrl":"https://specmatic.io","docsUrl":"https://specmatic.io/documentation/","repoUrl":"https://github.com/znsio/specmatic"},"filters":{"language":[{"name":"Kotlin","color":"bg-[#B1ACDF]","borderColor":"border-[#756BD9]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["mocking-and-testing"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Virtualan","description":"Mocking and testing platform for API and microservices. Allows you to create and setup mocks for OpenAPI and AsyncAPI contracts. Shows how to setup and create AsyncAPI GitHub Reference Examples and OpenAPI GitHub Reference Examples.","links":{"websiteUrl":"https://www.virtualan.io/index.html","repoUrl":"https://github.com/virtualansoftware"},"filters":{"technology":[{"name":"Kubernetes-native","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["mocking-and-testing"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Validators":{"description":"The following is a list of tools that validate AsyncAPI documents.","toolsList":[{"title":"AMF","description":"AMF (AML Modeling Framework) is an open-source library capable of parsing and validating AML metadata documents.","links":{"docsUrl":"https://a.ml/docs/","repoUrl":"https://github.com/aml-org/amf"},"filters":{"language":[{"name":"Scala","color":"bg-[#FFA299]","borderColor":"border-[#DF301F]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI GitHub Action","description":"This action validates if the AsyncAPI schema file is valid or not.","links":{"websiteUrl":"https://github.com/marketplace/actions/asyncapi-github-action","repoUrl":"https://github.com/WaleedAshraf/asyncapi-github-action"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["github-action","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI Parser","description":"Use this package to parse and validate AsyncAPI documents —either YAML or JSON— in your Node.js or browser application. Updated bundle for the browser is always attached to the GitHub Release.","links":{"repoUrl":"https://github.com/asyncapi/parser-js"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"AsyncAPI Parser","description":"The AsyncAPI Parser validates AsyncAPI documents according to dedicated schemas.","links":{"repoUrl":"https://github.com/asyncapi/parser-go"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":true,"technology":[]}},{"title":"AsyncAPI Parser Wrapper","description":"Use this library to parse and validate AsyncAPI documents — either YAML or JSON — in your Java application. It is a Java wrapper over JavaScript Parser implemented using J2V8.","links":{"repoUrl":"https://github.com/AsyncAPITools/parser-java-wrapper"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI Validation","description":"Message validation package for YAML and JSON AsyncAPI documents.","links":{"repoUrl":"https://github.com/Elhebert/asyncapi-validation"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"asyncapi-validator","description":"It allows you to validate the schema of your messages against your AsyncAPI schema definition. You can use it with Kafka, RabbitMQ or any other messaging/queue.","links":{"repoUrl":"https://github.com/WaleedAshraf/asyncapi-validator"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI.Net","description":"The AsyncAPI.NET SDK contains a useful object model for AsyncAPI documents in .NET along with common serializers to extract raw OpenAPI JSON and YAML documents from the model.","links":{"websiteUrl":"https://github.com/LEGO/AsyncAPI.NET/","repoUrl":"https://github.com/LEGO/AsyncAPI.NET"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"}],"categories":["converters","code-first","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Spectral","description":"A flexible JSON/YAML linter for creating automated style guides, with baked in support for OpenAPI v3.1, v3.0, and v2.0 as well as AsyncAPI v2.x.","links":{"repoUrl":"https://github.com/stoplightio/spectral"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Compare tools":{"description":"The following is a list of tools that compare AsyncAPI documents.","toolsList":[{"title":"Api-Smart-Diff","description":"It allows you to compare two API documents and classify changes. Supported API specifications: OpenAPI, AsyncAPI, JsonSchema.","links":{"repoUrl":"https://github.com/udamir/api-smart-diff"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"categories":["compare-tool"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI Diff","description":"Diff is a library that compares two AsyncAPI Documents and provides information about the differences by pointing out explicitly information like breaking changes.","links":{"repoUrl":"https://github.com/asyncapi/diff"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["compare-tool"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"jasyncapicmp","description":"Tool for comparing two AsyncAPI versions and evaluating compatibility.","links":{"websiteUrl":"https://siom79.github.io/jasyncapicmp/","docsUrl":"https://github.com/siom79/jasyncapicmp","repoUrl":"https://github.com/siom79/jasyncapicmp"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["compare-tool"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"jasyncapicmp","description":"Tool/library/maven-plugin for comparing two AsyncAPI versions and evaluating compatibility.","links":{"websiteUrl":"https://siom79.github.io/jasyncapicmp/","repoUrl":"https://github.com/siom79/jasyncapicmp"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["compare-tool"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"CLIs":{"description":"The following is a list of tools that you can work with in terminal or do some CI/CD automation.","toolsList":[{"title":"AsyncAPI CLI","description":"One CLI to rule them all. \nThis is a CLI that aims to integrate all AsyncAPI tools that you need while AsyncAPI document development and maintainance. \nYou can use it to generate docs or code, validate AsyncAPI document and event create new documents.\n","links":{"websiteUrl":"https://www.asyncapi.com/tools/cli","repoUrl":"https://github.com/asyncapi/cli"},"filters":{"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["others","cli"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"AsyncAPI CLI","description":"One CLI to rule them all. \nThis is a CLI that aims to integrate all AsyncAPI tools that you need while AsyncAPI document development and maintainance. \nYou can use it to generate docs or code, validate AsyncAPI document and event create new documents.\n","links":{"websiteUrl":"https://www.asyncapi.com/tools/cli","repoUrl":"https://github.com/hkirat/asyncapi-fork"},"filters":{"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["others","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI-format","description":"Format an AsyncAPI document by ordering, casing, formatting, and filtering fields.","links":{"repoUrl":"https://github.com/asyncapi/converter-go"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["converter","cli"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Bundlers":{"description":"The following is a list of tools that you can work with to bundle AsyncAPI documents.","toolsList":[{"title":"Api-ref-bundler","description":"It allows you bundle/dereference external/internal $refs in Json based API document. Supported specifications: OpenAPI, AsyncAPI, JsonSchema.","links":{"repoUrl":"https://github.com/udamir/api-ref-bundler"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["bundler"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI Bundler","description":"Combine multiple AsyncAPI specification files into one.","links":{"repoUrl":"https://github.com/asyncapi/bundler"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["bundler"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"IDE Extensions":{"description":"The following is a list of extensions for different IDEs like VSCode, IntelliJ IDEA and others","toolsList":[{"title":"asyncapi-preview","description":"VSCode extension that enables you to:\n - Preview documentation generated using you AsyncAPI document. It uses AsyncAPI React component under the hood,\n - Create AsyncAPI documents faster using SmartPaste functionality\n","links":{"repoUrl":"https://github.com/asyncapi/vs-asyncapi-preview"},"filters":{"technology":[{"name":"VSCode","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"SmartPaste","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ide-extension"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"asyncapi-preview","description":"VSCode extension that enables you to:\n - Preview documentation generated using you AsyncAPI document. It uses AsyncAPI React component under the hood,\n - Create AsyncAPI documents faster using SmartPaste functionality\n","links":{"repoUrl":"https://github.com/Savio629/testing2"},"filters":{"technology":[{"name":"VSCode","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"SmartPaste","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ide-extension"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"jAsyncAPI - IDEA plugin","description":"Idea plugin for the java-asyncapi - Helps to edit and validate AsyncAPI schemas.","links":{"websiteUrl":"https://plugins.jetbrains.com/plugin/15673-asyncapi","docsUrl":"https://github.com/asyncapi/jasyncapi-idea-plugin#usage","repoUrl":"https://github.com/asyncapi/jasyncapi-idea-plugin"},"filters":{"language":[{"name":"Kotlin","color":"bg-[#B1ACDF]","borderColor":"border-[#756BD9]"}],"technology":[{"name":"JetBrains","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"IntelliJ IDEA","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ide-extension"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"AsyncAPI Generator Templates":{"description":"The following is a list of templates compatible with AsyncAPI Generator. You can use them to generate apps, clients or documentation from your AsyncAPI documents.","toolsList":[{"title":"HTML Template","description":"HTML template for AsyncAPI Generator. Use it to generate a static docs. It is using AsyncAPI React component under the hood.","links":{"repoUrl":"https://github.com/asyncapi/html-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"HTML","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Java Spring Cloud Stream Template","description":"Java Spring Cloud Stream template for the AsyncAPI Generator","links":{"repoUrl":"https://github.com/asyncapi/java-spring-cloud-stream-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Java Spring Template","description":"Java Spring template for the AsyncAPI Generator","links":{"repoUrl":"https://github.com/asyncapi/java-spring-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Gradle","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Java Template","description":"Java template for the AsyncAPI Generator","links":{"repoUrl":"https://github.com/asyncapi/java-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Java","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Node.js Multiprotocol Template","description":"This template generates a server using your AsyncAPI document. It supports multiple different protocols, like Kafka or MQTT. It is designed in the way that generated code is a library and with it's API you can start the server, send messages or register a middleware for listening incoming messages. Runtime message validation included.","links":{"repoUrl":"https://github.com/asyncapi/nodejs-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Node.js Websockets Template","description":"Node.js WebSockets template for the AsyncAPI Generator. It showcases how from a single AsyncAPI document you can generate a server and a client at the same time.","links":{"repoUrl":"https://github.com/asyncapi/nodejs-ws-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["generator-template"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"Others":{"description":"The following is a list of tools that comes under Other category.","toolsList":[{"title":"AsyncAPI CLI","description":"One CLI to rule them all. \nThis is a CLI that aims to integrate all AsyncAPI tools that you need while AsyncAPI document development and maintainance. \nYou can use it to generate docs or code, validate AsyncAPI document and event create new documents.\n","links":{"websiteUrl":"https://www.asyncapi.com/tools/cli","repoUrl":"https://github.com/asyncapi/cli"},"filters":{"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["others","cli"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"AsyncAPI CLI","description":"One CLI to rule them all. \nThis is a CLI that aims to integrate all AsyncAPI tools that you need while AsyncAPI document development and maintainance. \nYou can use it to generate docs or code, validate AsyncAPI document and event create new documents.\n","links":{"websiteUrl":"https://www.asyncapi.com/tools/cli","repoUrl":"https://github.com/hkirat/asyncapi-fork"},"filters":{"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["others","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]}}
\ No newline at end of file
diff --git a/context/AppContext.tsx b/context/AppContext.tsx
index 696c2ae6f2db..5d53b72dfe77 100644
--- a/context/AppContext.tsx
+++ b/context/AppContext.tsx
@@ -1,4 +1,5 @@
import { createContext } from 'react';
-import { AppContextType } from '@/types/context/AppContext';
-export default createContext({ path: "" });
+import type { AppContextType } from '@/types/context/AppContext';
+
+export default createContext({ path: '' });
diff --git a/context/GenericPostContext.tsx b/context/GenericPostContext.tsx
index 65b510b15a84..6d9b519d7bd3 100644
--- a/context/GenericPostContext.tsx
+++ b/context/GenericPostContext.tsx
@@ -2,4 +2,4 @@ import { createContext } from 'react';
import type { IPosts } from '@/types/post';
-export default createContext<{ post: IPosts['blog'][number] | IPosts['docs'][number]} | undefined>(undefined);
+export default createContext<{ post: IPosts['blog'][number] | IPosts['docs'][number] } | undefined>(undefined);
diff --git a/context/ToolFilterContext.tsx b/context/ToolFilterContext.tsx
index b3ea042f49d3..0b2b582dcc70 100644
--- a/context/ToolFilterContext.tsx
+++ b/context/ToolFilterContext.tsx
@@ -1,5 +1,5 @@
import { useRouter } from 'next/router';
-import { createContext, useEffect, useState } from 'react';
+import React, { createContext, useEffect, useState } from 'react';
interface ToolFilterContextProps {
isPaid: string;
diff --git a/markdown/blog/2023-April-docs-report.md b/markdown/blog/2023-April-docs-report.md
index d57467c04693..3a8feb36e68e 100644
--- a/markdown/blog/2023-April-docs-report.md
+++ b/markdown/blog/2023-April-docs-report.md
@@ -13,6 +13,9 @@ authors:
byline: In April 2023, the AsyncAPI documentation experienced significant growth with 8,889 sessions and 4,575 unique users, including 2,895 new users.
---
+import ContributionNotes from '@/assets/docs/fragments/contribution-notes.md';
+import TalkToMe from '@/assets/docs/fragments/talk-to-me.md';
+
# AsyncAPI Docs Report - April 2023
In April 2023, the AsyncAPI documentation experienced significant growth with **8,889 sessions** and **4,575 unique users**, including **2,895 new users**. April was a strong month for our expanding docs community.
@@ -109,18 +112,8 @@ style DC fill:#E1FEC1,stroke:#000000,stroke-width:2px;
---
## How to contribute to AsyncAPI Docs
-Did you know that you can contribute Docs to AsyncAPI as well? Code isn't the only way to contribute to OSS; docs are a **huge** help that benefit the entire OSS ecosystem. At AsyncAPI, we value Doc contributions as much as every other type of contribution. ❤️
-
-To get started as a Docs contributor:
-1. Familiarize yourself with our [project's Contribution Guide](https://github.com/asyncapi/community/blob/master/CONTRIBUTING.md) and our [Code of Conduct](https://github.com/asyncapi/.github/blob/master/CODE_OF_CONDUCT.md).
-2. Head over to our Docs GH Board [here](https://github.com/orgs/asyncapi/projects/12).
-3. Pick an issue you would like to contribute to and leave a comment introducing yourself. This is also the perfect place to leave any questions you may have on how to get started.
-4. If there is no work done in that Docs issue yet, feel free to open a PR and get started!
-
-### Tag me in your AsyncAPI Doc PRs
-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) 🐙.
+Did you know that you can contribute Docs to AsyncAPI as well?
+
### Talk to me
-I want and need to listen 👂🏽 to all of your perspectives and ideas. Please don't be shy to express to me what you think needs to be documented first or what is missing. 📝 There's a lot of good work ahead, but **you** determine _our content roadmap_ because the OSS community needs should always come first.✨
+
diff --git a/markdown/blog/2023-Q1-docs-report.md b/markdown/blog/2023-Q1-docs-report.md
index ef6ccc759956..1c90d29c37ed 100644
--- a/markdown/blog/2023-Q1-docs-report.md
+++ b/markdown/blog/2023-Q1-docs-report.md
@@ -14,6 +14,9 @@ authors:
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.
---
+import ContributionNotes from '@/assets/docs/fragments/contribution-notes.md';
+import TalkToMe from '@/assets/docs/fragments/talk-to-me.md';
+
# AsyncAPI Documentation Report - Q1 2023
During Q1 2023, AsyncAPI Docs had **26,875 sessions** and **13,506 unique users**.
@@ -170,18 +173,8 @@ style G fill:#FF6EC7,stroke:#000000,stroke-width:2px;
---
## How to contribute to AsyncAPI Docs
-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. At AsyncAPI, we value Doc contributions as much as every other type of contribution. ❤️
-
-To get started as a Docs contributor:
-1. Familiarize yourself with our [project's Contribution Guide](https://github.com/asyncapi/community/blob/master/CONTRIBUTING.md) and our [Code of Conduct](https://github.com/asyncapi/.github/blob/master/CODE_OF_CONDUCT.md).
-2. Head over to our Docs GH Board [here](https://github.com/orgs/asyncapi/projects/12).
-3. Pick an issue you would like to contribute to and leave a comment introducing yourself. This is also the perfect place to leave any questions you may have on how to get started.
-4. If there is no work done in that Docs issue yet, feel free to open a PR and get started!
-
-### Tag me in your AsyncAPI Doc PRs
-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) 🐙.
+Did you know that you can contribute Docs to AsyncAPI as well?
+
### Talk to me
-I want and need to listen 👂🏽 to all of your perspectives and ideas. Please don't be shy to express to me what you think needs to be documented first or what is missing. 📝 There's a lot of good work ahead, but **you** determine _our content roadmap_ because the OSS community needs should always come first.✨
+
diff --git a/markdown/blog/2023-Q4-docs-report.md b/markdown/blog/2023-Q4-docs-report.md
index 8805ec444b47..8baaf02d3c04 100644
--- a/markdown/blog/2023-Q4-docs-report.md
+++ b/markdown/blog/2023-Q4-docs-report.md
@@ -14,6 +14,9 @@ authors:
excerpt: In Q4, AsyncAPI docs had primary engagement across the tutorials and reference content buckets.
---
+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.
@@ -94,19 +97,8 @@ A --> H
---
### How to contribute to AsyncAPI Docs
-Did you know that you can contribute Docs to AsyncAPI as well? Code isn't the only way to contribute to OSS; docs are a **huge** help that benefits the entire OSS ecosystem. At AsyncAPI, we value Doc contributions as much as every other type of contribution. ❤️
-
-To get started as a Docs contributor:
-1. Familiarize yourself with our [project's Contribution Guide](https://github.com/asyncapi/community/blob/master/CONTRIBUTING.md) and our [Code of Conduct](https://github.com/asyncapi/.github/blob/master/CODE_OF_CONDUCT.md).
-2. Head over to our Docs GH Board [here](https://github.com/orgs/asyncapi/projects/12).
-3. Pick an issue you would like to contribute to and leave a comment introducing yourself and questions on how to get started.
-4. If there is no work done in that Docs issue yet, feel free to open a PR and get started!
-5. Send me a DM in Slack!
-
-#### Tag me in your AsyncAPI Doc PRs
-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) 🐙.
+Did you know that you can contribute Docs to AsyncAPI as well?
+
#### Talk to me
-I want and need to listen 👂🏽 to all of your perspectives and ideas. Please don't be shy to express to me what you think needs to be documented first or what is missing. 📝 There's a lot of good work ahead, but **you** determine _our content roadmap_ because the OSS community needs should always come first.✨
+
diff --git a/markdown/blog/2023-july-docs-report.md b/markdown/blog/2023-july-docs-report.md
index 34b0fb112284..867d3359c466 100644
--- a/markdown/blog/2023-july-docs-report.md
+++ b/markdown/blog/2023-july-docs-report.md
@@ -11,7 +11,10 @@ authors:
photo: /img/avatars/canela-ale.webp
link: https://www.linkedin.com/in/alejandra-quetzalli/
byline: In July 2023, the AsyncAPI documentation had 7,443 sessions and 3,895 unique users, including 2,345 new users.
----
+---
+
+import ContributionNotes from '@/assets/docs/fragments/contribution-notes.md';
+import TalkToMe from '@/assets/docs/fragments/talk-to-me.md';
# AsyncAPI Docs Report - July 2023
@@ -87,19 +90,8 @@ A --> H
---
### How to contribute to AsyncAPI Docs
-Did you know that you can contribute Docs to AsyncAPI as well? Code isn't the only way to contribute to OSS; docs are a **huge** help that benefit the entire OSS ecosystem. At AsyncAPI, we value Doc contributions as much as every other type of contribution. ❤️
-
-To get started as a Docs contributor:
-1. Familiarize yourself with our [project's Contribution Guide](https://github.com/asyncapi/community/blob/master/CONTRIBUTING.md) and our [Code of Conduct](https://github.com/asyncapi/.github/blob/master/CODE_OF_CONDUCT.md).
-2. Head over to our Docs GH Board [here](https://github.com/orgs/asyncapi/projects/12).
-3. Pick an issue you would like to contribute to and leave a comment introducing yourself and questions on how to get started.
-4. If there is no work done in that Docs issue yet, feel free to open a PR and get started!
-5. Send me a DM in Slack!
-
-#### Tag me in your AsyncAPI Doc PRs
-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) 🐙.
+Did you know that you can contribute Docs to AsyncAPI as well?
+
#### Talk to me
-I want and need to listen 👂🏽 to all of your perspectives and ideas. Please don't be shy to express to me what you think needs to be documented first or what is missing. 📝 There's a lot of good work ahead, but **you** determine _our content roadmap_ because the OSS community needs should always come first.✨
\ No newline at end of file
+
\ No newline at end of file
diff --git a/markdown/blog/2023-june-docs-report.md b/markdown/blog/2023-june-docs-report.md
index c15a462c2e53..604548186a21 100644
--- a/markdown/blog/2023-june-docs-report.md
+++ b/markdown/blog/2023-june-docs-report.md
@@ -13,6 +13,9 @@ authors:
byline: In June 2023, the AsyncAPI documentation had 7,827 sessions and 4,203 unique users, including 2,566 new users.
---
+import ContributionNotes from '@/assets/docs/fragments/contribution-notes.md';
+import TalkToMe from '@/assets/docs/fragments/talk-to-me.md';
+
# AsyncAPI Docs Report - June 2023
In June 2023, the AsyncAPI documentation had **7,827 sessions** and **4,203 unique users**, including **2,566 new users**, showing consistent engagement within our vibrant docs community.
@@ -120,19 +123,8 @@ style K fill:#C1F9F7,stroke:#000000,stroke-width:2px;
---
### How to contribute to AsyncAPI Docs
-Did you know that you can contribute Docs to AsyncAPI as well? Code isn't the only way to contribute to OSS; docs are a **huge** help that benefit the entire OSS ecosystem. At AsyncAPI, we value Doc contributions as much as every other type of contribution. ❤️
-
-To get started as a Docs contributor:
-1. Familiarize yourself with our [project's Contribution Guide](https://github.com/asyncapi/community/blob/master/CONTRIBUTING.md) and our [Code of Conduct](https://github.com/asyncapi/.github/blob/master/CODE_OF_CONDUCT.md).
-2. Head over to our Docs GH Board [here](https://github.com/orgs/asyncapi/projects/12).
-3. Pick an issue you would like to contribute to and leave a comment introducing yourself. This is also the perfect place to leave any questions you may have on how to get started.
-4. If there is no work done in that Docs issue yet, feel free to open a PR and get started!
-5. Send me a DM in Slack!
-
-#### Tag me in your AsyncAPI Doc PRs
-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) 🐙.
+Did you know that you can contribute Docs to AsyncAPI as well?
+
#### Talk to me
-I want and need to listen 👂🏽 to all of your perspectives and ideas. Please don't be shy to express to me what you think needs to be documented first or what is missing. 📝 There's a lot of good work ahead, but **you** determine _our content roadmap_ because the OSS community needs should always come first.✨
+
diff --git a/markdown/blog/2023-may-docs-report.md b/markdown/blog/2023-may-docs-report.md
index a60248dd4061..2b21c61b1f64 100644
--- a/markdown/blog/2023-may-docs-report.md
+++ b/markdown/blog/2023-may-docs-report.md
@@ -13,6 +13,9 @@ authors:
byline: In May 2023, the AsyncAPI documentation had 9,453 sessions and 4,876 unique users, including 2,895 new users.
---
+import ContributionNotes from '@/assets/docs/fragments/contribution-notes.md';
+import TalkToMe from '@/assets/docs/fragments/talk-to-me.md';
+
# AsyncAPI Docs Report - May 2023
In May 2023, the AsyncAPI documentation had **9,453 sessions** and **4,876 unique users**, including **2,895 new users**, highlighting the increasing interest and engagement within our vibrant docs community. May was a busy month in our expanding docs community!
@@ -71,18 +74,8 @@ style DA fill:#E1FEC1,stroke:#000000,stroke-width:2px;
---
## How to contribute to AsyncAPI Docs
-Did you know that you can contribute Docs to AsyncAPI as well? Code isn't the only way to contribute to OSS; docs are a **huge** help that benefit the entire OSS ecosystem. At AsyncAPI, we value Doc contributions as much as every other type of contribution. ❤️
-
-To get started as a Docs contributor:
-1. Familiarize yourself with our [project's Contribution Guide](https://github.com/asyncapi/community/blob/master/CONTRIBUTING.md) and our [Code of Conduct](https://github.com/asyncapi/.github/blob/master/CODE_OF_CONDUCT.md).
-2. Head over to our Docs GH Board [here](https://github.com/orgs/asyncapi/projects/12).
-3. Pick an issue you would like to contribute to and leave a comment introducing yourself. This is also the perfect place to leave any questions you may have on how to get started.
-4. If there is no work done in that Docs issue yet, feel free to open a PR and get started!
-
-### Tag me in your AsyncAPI Doc PRs
-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) 🐙.
+Did you know that you can contribute Docs to AsyncAPI as well?
+
### Talk to me
-I want and need to listen 👂🏽 to all of your perspectives and ideas. Please don't be shy to express to me what you think needs to be documented first or what is missing. 📝 There's a lot of good work ahead, but **you** determine _our content roadmap_ because the OSS community needs should always come first.✨
+
diff --git a/markdown/blog/2024-august-summary.md b/markdown/blog/2024-august-summary.md
index 477210de06a1..368cef32c319 100644
--- a/markdown/blog/2024-august-summary.md
+++ b/markdown/blog/2024-august-summary.md
@@ -11,7 +11,6 @@ authors:
link: https://www.linkedin.com/in/v-thulisile-sibanda/
byline: AsyncAPI Community Manager
excerpt: 'August Community Update'
-featured: true
---
The summer holidays are almost over, but the community hasn't slowed down. We've been receiving great news, and I'm thrilled to share that our list of sponsors is growing.
diff --git a/markdown/blog/2024-september-summary-and-london.md b/markdown/blog/2024-september-summary-and-london.md
new file mode 100644
index 000000000000..cbac4f5563ed
--- /dev/null
+++ b/markdown/blog/2024-september-summary-and-london.md
@@ -0,0 +1,200 @@
+---
+title: "September Community Update And AsyncAPI Conference London 2024"
+date: 2024-10-02T06:00:00+01:00
+type: Communication
+tags:
+ - Project Status
+cover: /img/posts/2024-blog-banner/blog-banner-september.webp
+authors:
+ - name: Thulisile Sibanda
+ photo: /img/avatars/thulieblack.webp
+ link: https://www.linkedin.com/in/v-thulisile-sibanda/
+ byline: AsyncAPI Community Manager
+excerpt: 'September Community Update and London Conference Highlights'
+featured: true
+---
+
+In September, we had our second in-person AsyncAPI conference after Helsinki; read all about it in the [AsyncAPI Helsinki Conference update](https://www.asyncapi.com/blog/helsinki-and-community).
+
+This time, I had the privilege of being present in person. First and foremost, I would like to thank [Gravitee.io](https://www.gravitee.io/) and to [Georgie Burrows](https://www.linkedin.com/in/georgieburrows/) for sponsoring the AsyncAPI Conference. Their sponsorship enabled me to cover the visa expenses and travel costs. I also want to express my gratitude to [Lukasz Gornicki](https://www.linkedin.com/in/lukasz-gornicki-a621914) for his support and assistance throughout the process. It wasn't easy, but in the end, it was an incredible achievement for all of us, especially for me.
+
+## AsyncAPI Conference London Edition 2024
+This year's London Edition was made possible by the amazing folks at [APIdays](https://www.apidays.global/), and we were part of the 2-day APIdays London Conference. The AsyncAPI track took place on the first day, and we had an incredible lineup of speakers and talks that attracted an entire room of attendees.
+
+
+
+Lorna started things off with a session on Better AsyncAPI Governance and how to devise sensible standards that support usability, security, and reliability.
+
+
+
+Artur followed with a demonstration on harmonizing NATS, CloudEvents, and AsyncAPI to build scalable, robust, and maintainable systems.
+
+
+
+Eduardo then shared a success story on how using AsyncAPI helps build API management platforms that enable event-driven architectures across domains by decoupling producers and consumers without compromising data contracts between parties.
+
+
+
+Later, Swen spoke on lessons we can learn from synchronous API design and architecture.
+
+
+
+During the break, the `API Specs and Standards Booth` was busy with people interested in what the AsyncAPI Initiative is all about and the work we do.
+
+
+
+Dale gave a session on how much information you need to know to design a solution around Kafka topics and illustrated the critical additional information a provider of an asynchronous API needs to provide.
+
+
+
+Laurent shared how to use Microcks ready to work with Testcontainers to provide solutions for mocking and testing APIs without extensive coding.
+
+
+
+Will then demonstrated how Architecture as Code and AsyncAPI work together to create deployable environments for production and the deployment of WebSocket-based APIs in a financial organization.
+
+
+
+Sho ended the day by taking us on a journey on how to build a cross-exchange trading bot and how AsyncAPI has the proper tooling to tackle pain points such as document inconsistency and missing language support.
+
+
+
+All the talks were incredible, and even the questions asked during the sessions were very insightful. Some of the slide presentations and recordings will soon be available under the [Resources Hub at the AsyncAPI Conference website](https://conference.asyncapi.com/).
+
+### API Specs And Standards Booth
+We teamed up with the OpenAPI Initiative team at the booth and had many insightful conversations.
+The first day was bustling with activity, and it was interesting to see how many people were not familiar with AsyncAPI and the community.
+They were very intrigued by how a bunch of folks with diverse expertise and skills from different continents and companies came together to represent AsyncAPI despite having never met. Our maintainers and ambassadors did a fantastic job educating and answering questions about the community, specification, and tooling.
+
+
+Day 2 at the conference was calmer and less busy than the first day, but we had the opportunity to visit other booths and get some contacts for the future.
+
+
+
+I would like to thank the experts for taking their time at the conference and volunteering at the `API Specs and Standards Booth`.
+
+
+
+## AsyncAPI Conf in Paris
+As you can tell, London was a success, and now there's an opportunity to be part of another fantastic AsyncAPI conference in Paris. [The Call for Proposals for Paris](https://conference.asyncapi.com/venue/Paris) will soon close on the 12th of October, and we encourage anyone to apply.
+
+## AsyncAPI Bounty Program
+This month, we celebrate a significant milestone: the first anniversary of the official launch of the AsyncAPI Bounty Program. Our goal has been and continues to recognize and reward the efforts of our maintainers and contributors and to challenge the notion that contributing to Open Source is always free. You can learn about the history of the AsyncAPI Program from [the redistribution of Open Collective funds discussion](https://github.com/orgs/asyncapi/discussions/541#discussioncomment-5462792).
+
+As a community, we have greatly benefited from the program. For example, we have used the AsyncAPI Cheat Sheet at conferences, saved costs on Digital Ocean, and implemented an automated TSC voting process. For more details, [please read the AsyncAPI Bounty Program Summary](https://www.asyncapi.com/blog/asyncapi-bounty-program-2024).
+
+Kudos to [Viacheslav Turovskyi](https://github.com/aeworxet) (Ash) for his outstanding work in leading and managing the initiative smoothly.
+
+## AsyncAPI Mantainership Program
+The Maintainership Program is progressing well; we have received some excellent project ideas. Once the project ranking is complete, we will announce the call for applications soon.
+
+Keep an eye on the `#09_mentorships` Slack channel for the exact dates. For details on the submitted projects, [please take a look at the Mentor/Maintainership discussion](https://github.com/orgs/asyncapi/discussions/1361).
+
+## AsyncAPI Ambassador
+We are excited to welcome [Lorna Mitchell](https://www.linkedin.com/in/lornajane), VP of Developer Experience at Redocly, to the [AsyncAPI Ambassador Program](https://www.asyncapi.com/community/ambassadors/lornajane).
+
+
+
+## Coming in October
+- **AsyncAPI Community Updates Newsletter** - The October Edition issue will arrive in your inbox on the 9th. [Ensure you subscribe to the AsyncAPI Newsletter](https://www.asyncapi.com/newsletter); you don't want to miss out.
+- **AsyncAPI Online Conference** - [The Online Conference will take place on the 30th of October](https://conference.asyncapi.com/venue/Online). Be sure to check the website for the Agenda and Speakers.
diff --git a/markdown/blog/changes-coming-docs.md b/markdown/blog/changes-coming-docs.md
index e39864b456f8..cd2291fa5152 100644
--- a/markdown/blog/changes-coming-docs.md
+++ b/markdown/blog/changes-coming-docs.md
@@ -14,6 +14,9 @@ authors:
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.
---
+import ContributionNotes from '@/assets/docs/fragments/contribution-notes.md';
+import TalkToMe from '@/assets/docs/fragments/talk-to-me.md';
+
## 🦄 Hola, soy Alejandra Quetzalli
¡Hola! 😄
@@ -122,22 +125,8 @@ Think of a How-To as the bucket to address problems and advanced scenarios that
***
## 👉🏽 How to contribute to AsyncAPI Docs
-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. At AsyncAPI, we value Doc contributions as much as every other type of contribution. ❤️
-
-
-To get started as a Docs contributor:
-1. Familiarize yourself with our [project's Contribution Guide](https://github.com/asyncapi/community/blob/master/CONTRIBUTING.md) and our [Code of Conduct](https://github.com/asyncapi/.github/blob/master/CODE_OF_CONDUCT.md).
-2. Head over to our Docs GH Board [here](https://github.com/orgs/asyncapi/projects/8).
-3. Pick an issue you would like to contribute to and leave a comment introducing yourself. This is also the perfect place to leave any questions you may have on how to get started.
-4. If there is no work done in that Docs issue yet, feel free to open a PR and get started!
-
-### 🏷 Tag me in your AsyncAPI Doc PRs
-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) 🐙.
-
+Did you know that you can contribute Docs to AsyncAPI as well?
+
## 🙂 Talk to me
-I want and need to listen 👂🏽 to all of your perspectives and ideas. Please don't be shy to express to me what you think needs to be documented first or what is missing. 📝
-
-There's a lot of good work ahead, but **you** determine _our content roadmap_ because the OSS community needs should always come first.✨
+
diff --git a/markdown/blog/google-season-of-docs-2022.md b/markdown/blog/google-season-of-docs-2022.md
index 7e35562a821b..c83a1bcba9e8 100644
--- a/markdown/blog/google-season-of-docs-2022.md
+++ b/markdown/blog/google-season-of-docs-2022.md
@@ -14,6 +14,8 @@ authors:
excerpt: Check out the Docs project proposal we're submitting to GSoD 2022! You won't want to miss out.
---
+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. ❤️
@@ -89,18 +91,6 @@ We have set aside 2 mentors for now, for our 2 projects: improving our IA and re
___
## Get started contributing to AsyncAPI Docs Today
-Last but not least, don't forget that code isn't the only way to contribute to OSS; Dev Docs are a **huge** help that benefit the entire OSS ecosystem. At AsyncAPI, we value Doc contributions as much as every other type of contribution. ❤️
-
-To get started as a Docs contributor:
-1. Familiarize yourself with our [project's Contribution Guide](https://github.com/asyncapi/community/blob/master/CONTRIBUTING.md) and our [Code of Conduct](https://github.com/asyncapi/.github/blob/master/CODE_OF_CONDUCT.md).
-2. Head over to our Docs GH Board [here](https://github.com/orgs/asyncapi/projects/8).
-3. Pick an issue you would like to contribute to and leave a comment introducing yourself. This is also the perfect place to leave any questions you may have on how to get started.
-4. If there is no work done in that Docs issue yet, feel free to open a PR and get started!
-
-### Tag me in your AsyncAPI Doc PRs
-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) 🐙.
-
+Last but not least, don't forget that
_-A.Q. 👩🏻💻 and Canela 🐕🦺_
\ No newline at end of file
diff --git a/markdown/docs/community/index.md b/markdown/docs/community/index.md
index 57d4906396b2..5a4f879ea0ef 100644
--- a/markdown/docs/community/index.md
+++ b/markdown/docs/community/index.md
@@ -3,6 +3,8 @@ title: Overview
weight: 2
---
+import ContributionNotes from '@/assets/docs/fragments/contribution-notes.md';
+
## Community: Guidelines and resources around community.
Welcome to AsyncAPI **Community**! Our Community section documents the community guidelines and resources.
@@ -10,16 +12,6 @@ Welcome to AsyncAPI **Community**! Our Community section documents the community
## Contribute to the AsyncAPI Community section
-Code isn't the only way to contribute to OSS; Dev Docs are a **huge** help that benefit the entire OSS ecosystem. At AsyncAPI, we value Doc contributions as much as every other type of contribution. ❤️
-
-To get started as a Docs contributor:
-1. Familiarize yourself with our [project's Contribution Guide](https://github.com/asyncapi/community/blob/master/CONTRIBUTING.md) and our [Code of Conduct](https://github.com/asyncapi/.github/blob/master/CODE_OF_CONDUCT.md).
-2. Head over to our [AsyncAPI Docs Board](https://github.com/orgs/asyncapi/projects/12).
-3. Pick an issue you would like to contribute to and leave a comment introducing yourself. This is also the perfect place to leave any questions you may have on how to get started.
-4. If there is no work done in that Docs issue yet, feel free to open a PR and get started!
-
-### Docs contributor questions
-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) 🐙.
diff --git a/markdown/docs/concepts/asyncapi-document/adding-bindings.md b/markdown/docs/concepts/asyncapi-document/adding-bindings.md
index 7380fc5c30a3..cd86c3de62db 100644
--- a/markdown/docs/concepts/asyncapi-document/adding-bindings.md
+++ b/markdown/docs/concepts/asyncapi-document/adding-bindings.md
@@ -3,7 +3,7 @@ title: Adding bindings
weight: 260
---
-import BindingsOverview from '../../../../assets/docs/fragments/bindings-overview.md'
+import BindingsOverview from '@/assets/docs/fragments/bindings-overview.md'
diff --git a/markdown/docs/concepts/index.md b/markdown/docs/concepts/index.md
index 4e028aaf5979..34e581fea077 100644
--- a/markdown/docs/concepts/index.md
+++ b/markdown/docs/concepts/index.md
@@ -3,6 +3,8 @@ title: 'Overview'
weight: 1
---
+import ContributionNotes from '@/assets/docs/fragments/contribution-notes.md';
+
## Concepts: Define AsyncAPI features and capabilities
Welcome to AsyncAPI **Concepts**! Our Concepts section will define the concepts of AsyncAPI features and capabilities.
@@ -10,16 +12,6 @@ Welcome to AsyncAPI **Concepts**! Our Concepts section will define the concepts
## Contribute to AsyncAPI Concepts
-Code isn't the only way to contribute to OSS; Dev Docs are a **huge** help that benefit the entire OSS ecosystem. At AsyncAPI, we value Doc contributions as much as every other type of contribution. ❤️
-
-To get started as a Docs contributor:
-1. Familiarize yourself with our [project's Contribution Guide](https://github.com/asyncapi/community/blob/master/CONTRIBUTING.md) and our [Code of Conduct](https://github.com/asyncapi/.github/blob/master/CODE_OF_CONDUCT.md).
-2. Head over to our [AsyncAPI Docs Board](https://github.com/orgs/asyncapi/projects/12).
-3. Pick an issue you would like to contribute to and leave a comment introducing yourself. This is also the perfect place to leave any questions you may have on how to get started.
-4. If there is no work done in that Docs issue yet, feel free to open a PR and get started!
-
-### Docs contributor questions
-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) 🐙.
diff --git a/markdown/docs/guides/index.md b/markdown/docs/guides/index.md
index 048819267e49..99118858318e 100644
--- a/markdown/docs/guides/index.md
+++ b/markdown/docs/guides/index.md
@@ -3,6 +3,8 @@ title: 'Overview'
weight: 1
---
+import ContributionNotes from '@/assets/docs/fragments/contribution-notes.md';
+
## Guides: Teaches AsyncAPI's capabilities at a high level
Welcome to AsyncAPI **Guides**! Our Guides section teaches AsyncAPI's capabilities and features at a high level.
@@ -10,16 +12,6 @@ Welcome to AsyncAPI **Guides**! Our Guides section teaches AsyncAPI's capabiliti
## Contribute to AsyncAPI Guides
-Code isn't the only way to contribute to OSS; Dev Docs are a **huge** help that benefit the entire OSS ecosystem. At AsyncAPI, we value Doc contributions as much as every other type of contribution. ❤️
-
-To get started as a Docs contributor:
-1. Familiarize yourself with our [project's Contribution Guide](https://github.com/asyncapi/community/blob/master/CONTRIBUTING.md) and our [Code of Conduct](https://github.com/asyncapi/.github/blob/master/CODE_OF_CONDUCT.md).
-2. Head over to our [AsyncAPI Docs Board](https://github.com/orgs/asyncapi/projects/12).
-3. Pick an issue you would like to contribute to and leave a comment introducing yourself. This is also the perfect place to leave any questions you may have on how to get started.
-4. If there is no work done in that Docs issue yet, feel free to open a PR and get started!
-
-### Docs contributor questions
-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) 🐙.
diff --git a/markdown/docs/reference/bindings/index.md b/markdown/docs/reference/bindings/index.md
index 314c533f0ae4..83eb7ddd2849 100644
--- a/markdown/docs/reference/bindings/index.md
+++ b/markdown/docs/reference/bindings/index.md
@@ -5,7 +5,7 @@ weight: 15
## Overview
-import BindingsOverview from '../../../../assets/docs/fragments/bindings-overview.md'
+import BindingsOverview from '@/assets/docs/fragments/bindings-overview.md'
diff --git a/markdown/docs/reference/index.md b/markdown/docs/reference/index.md
index 540daa008aaa..b08034a917e9 100644
--- a/markdown/docs/reference/index.md
+++ b/markdown/docs/reference/index.md
@@ -3,6 +3,8 @@ title: Overview
weight: 2
---
+import ContributionNotes from '@/assets/docs/fragments/contribution-notes.md';
+
## Reference: AsyncAPI Specification
Welcome to AsyncAPI **Reference**! Our Reference section documents the AsyncAPI specification.
@@ -10,16 +12,6 @@ Welcome to AsyncAPI **Reference**! Our Reference section documents the AsyncAPI
## Contribute to the AsyncAPI Reference section
-Code isn't the only way to contribute to OSS; Dev Docs are a **huge** help that benefit the entire OSS ecosystem. At AsyncAPI, we value Doc contributions as much as every other type of contribution. ❤️
-
-To get started as a Docs contributor:
-1. Familiarize yourself with our [project's Contribution Guide](https://github.com/asyncapi/community/blob/master/CONTRIBUTING.md) and our [Code of Conduct](https://github.com/asyncapi/.github/blob/master/CODE_OF_CONDUCT.md).
-2. Head over to our [AsyncAPI Docs Board](https://github.com/orgs/asyncapi/projects/12).
-3. Pick an issue you would like to contribute to and leave a comment introducing yourself. This is also the perfect place to leave any questions you may have on how to get started.
-4. If there is no work done in that Docs issue yet, feel free to open a PR and get started!
-
-### Docs contributor questions
-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) 🐙.
diff --git a/markdown/docs/tools/cli/usage.md b/markdown/docs/tools/cli/usage.md
index 3a1ddf960222..95669e0efd6c 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.4.1 linux-x64 node-v18.20.4
+@asyncapi/cli/2.5.0 linux-x64 node-v18.20.4
$ asyncapi --help [COMMAND]
USAGE
$ asyncapi COMMAND
@@ -99,7 +99,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.4.1/src/commands/bundle.ts)_
+_See code: [src/commands/bundle.ts](https://github.com/asyncapi/cli/blob/v2.5.0/src/commands/bundle.ts)_
## `asyncapi config`
@@ -113,7 +113,7 @@ DESCRIPTION
CLI config settings
```
-_See code: [src/commands/config/index.ts](https://github.com/asyncapi/cli/blob/v2.4.1/src/commands/config/index.ts)_
+_See code: [src/commands/config/index.ts](https://github.com/asyncapi/cli/blob/v2.5.0/src/commands/config/index.ts)_
## `asyncapi config analytics`
@@ -133,7 +133,7 @@ DESCRIPTION
Enable or disable analytics for metrics collection
```
-_See code: [src/commands/config/analytics.ts](https://github.com/asyncapi/cli/blob/v2.4.1/src/commands/config/analytics.ts)_
+_See code: [src/commands/config/analytics.ts](https://github.com/asyncapi/cli/blob/v2.5.0/src/commands/config/analytics.ts)_
## `asyncapi config context`
@@ -147,7 +147,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.4.1/src/commands/config/context/index.ts)_
+_See code: [src/commands/config/context/index.ts](https://github.com/asyncapi/cli/blob/v2.5.0/src/commands/config/context/index.ts)_
## `asyncapi config context add CONTEXT-NAME SPEC-FILE-PATH`
@@ -169,7 +169,7 @@ DESCRIPTION
Add a context to the store
```
-_See code: [src/commands/config/context/add.ts](https://github.com/asyncapi/cli/blob/v2.4.1/src/commands/config/context/add.ts)_
+_See code: [src/commands/config/context/add.ts](https://github.com/asyncapi/cli/blob/v2.5.0/src/commands/config/context/add.ts)_
## `asyncapi config context current`
@@ -186,7 +186,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.4.1/src/commands/config/context/current.ts)_
+_See code: [src/commands/config/context/current.ts](https://github.com/asyncapi/cli/blob/v2.5.0/src/commands/config/context/current.ts)_
## `asyncapi config context edit CONTEXT-NAME NEW-SPEC-FILE-PATH`
@@ -207,7 +207,7 @@ DESCRIPTION
Edit a context in the store
```
-_See code: [src/commands/config/context/edit.ts](https://github.com/asyncapi/cli/blob/v2.4.1/src/commands/config/context/edit.ts)_
+_See code: [src/commands/config/context/edit.ts](https://github.com/asyncapi/cli/blob/v2.5.0/src/commands/config/context/edit.ts)_
## `asyncapi config context init [CONTEXT-FILE-PATH]`
@@ -230,7 +230,7 @@ DESCRIPTION
Initialize context
```
-_See code: [src/commands/config/context/init.ts](https://github.com/asyncapi/cli/blob/v2.4.1/src/commands/config/context/init.ts)_
+_See code: [src/commands/config/context/init.ts](https://github.com/asyncapi/cli/blob/v2.5.0/src/commands/config/context/init.ts)_
## `asyncapi config context list`
@@ -247,7 +247,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.4.1/src/commands/config/context/list.ts)_
+_See code: [src/commands/config/context/list.ts](https://github.com/asyncapi/cli/blob/v2.5.0/src/commands/config/context/list.ts)_
## `asyncapi config context remove CONTEXT-NAME`
@@ -267,7 +267,7 @@ DESCRIPTION
Delete a context from the store
```
-_See code: [src/commands/config/context/remove.ts](https://github.com/asyncapi/cli/blob/v2.4.1/src/commands/config/context/remove.ts)_
+_See code: [src/commands/config/context/remove.ts](https://github.com/asyncapi/cli/blob/v2.5.0/src/commands/config/context/remove.ts)_
## `asyncapi config context use CONTEXT-NAME`
@@ -287,7 +287,7 @@ DESCRIPTION
Set a context as current
```
-_See code: [src/commands/config/context/use.ts](https://github.com/asyncapi/cli/blob/v2.4.1/src/commands/config/context/use.ts)_
+_See code: [src/commands/config/context/use.ts](https://github.com/asyncapi/cli/blob/v2.5.0/src/commands/config/context/use.ts)_
## `asyncapi config versions`
@@ -304,22 +304,23 @@ DESCRIPTION
Show versions of AsyncAPI tools used
```
-_See code: [src/commands/config/versions.ts](https://github.com/asyncapi/cli/blob/v2.4.1/src/commands/config/versions.ts)_
+_See code: [src/commands/config/versions.ts](https://github.com/asyncapi/cli/blob/v2.5.0/src/commands/config/versions.ts)_
## `asyncapi convert [SPEC-FILE]`
-Convert asyncapi documents older to newer versions or OpenAPI documents to AsyncAPI
+Convert asyncapi documents older to newer versions or OpenAPI/postman-collection documents to AsyncAPI
```
USAGE
- $ asyncapi convert [SPEC-FILE] -f openapi|asyncapi [-h] [-o ] [-t ] [-p client|server]
+ $ asyncapi convert [SPEC-FILE] -f openapi|asyncapi|postman-collection [-h] [-o ] [-t ] [-p
+ client|server]
ARGUMENTS
SPEC-FILE spec path, url, or context-name
FLAGS
-f, --format=
diff --git a/pages/casestudies/[id].tsx b/pages/casestudies/[id].tsx
index d200869dc276..1a0a22d4e65b 100644
--- a/pages/casestudies/[id].tsx
+++ b/pages/casestudies/[id].tsx
@@ -2,6 +2,7 @@ import Link from 'next/link';
import type { MDXRemoteSerializeResult } from 'next-mdx-remote';
import { MDXRemote } from 'next-mdx-remote';
import { serialize } from 'next-mdx-remote/serialize';
+import React from 'react';
import { readYamlFile } from '@/components/helpers/read-yaml-file';
import type { ICaseStudy } from '@/types/post';
diff --git a/pages/casestudies/index.tsx b/pages/casestudies/index.tsx
index 7216a5bbd837..aa671f2d4de9 100644
--- a/pages/casestudies/index.tsx
+++ b/pages/casestudies/index.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import type { ICaseStudies } from '@/types/post';
import { HeadingLevel, HeadingTypeStyle } from '@/types/typography/Heading';
import { ParagraphTypeStyle } from '@/types/typography/Paragraph';
diff --git a/pages/community/dashboard.tsx b/pages/community/dashboard.tsx
index 8b91096b6aef..bfec4d96cc18 100644
--- a/pages/community/dashboard.tsx
+++ b/pages/community/dashboard.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import GoodFirstIssues from '../../components/dashboard/GoodFirstIssues';
import Header from '../../components/dashboard/Header';
import Table from '../../components/dashboard/table/Table';
diff --git a/pages/community/newsroom.tsx b/pages/community/newsroom.tsx
index a7e7c65e446a..5538fceeed07 100644
--- a/pages/community/newsroom.tsx
+++ b/pages/community/newsroom.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import Container from '../../components/layout/Container';
import GenericLayout from '../../components/layout/GenericLayout';
import NewsroomSection from '../../components/newsroom/Newsroom';
diff --git a/pages/community/tsc.tsx b/pages/community/tsc.tsx
index 2ec652b609ff..755652736f1b 100644
--- a/pages/community/tsc.tsx
+++ b/pages/community/tsc.tsx
@@ -1,5 +1,5 @@
import { sortBy } from 'lodash';
-import { useState } from 'react';
+import React, { useState } from 'react';
import type { Tsc } from '@/types/pages/community/Community';
diff --git a/pages/index.tsx b/pages/index.tsx
index 906ed8c65cfe..826a795c8aee 100644
--- a/pages/index.tsx
+++ b/pages/index.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import AsyncAPIColorIcon from '@/components/icons/AsyncAPIColorIcon';
import Loader from '@/components/Loader';
diff --git a/pages/tools/cli.tsx b/pages/tools/cli.tsx
index c9f0cae53129..a6e49a0bfe46 100644
--- a/pages/tools/cli.tsx
+++ b/pages/tools/cli.tsx
@@ -1,4 +1,5 @@
import { BadgeCheckIcon, CodeIcon, DocumentAddIcon, GlobeIcon } from '@heroicons/react/outline';
+import React from 'react';
import { HeadingLevel, HeadingTypeStyle } from '@/types/typography/Heading';
import { ParagraphTypeStyle } from '@/types/typography/Paragraph';
diff --git a/pages/tools/generator.tsx b/pages/tools/generator.tsx
index 813250bc8b09..8a6b70124e5d 100644
--- a/pages/tools/generator.tsx
+++ b/pages/tools/generator.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { HeadingLevel, HeadingTypeStyle } from '@/types/typography/Heading';
import { ParagraphTypeStyle } from '@/types/typography/Paragraph';
diff --git a/pages/tools/github-actions.tsx b/pages/tools/github-actions.tsx
index c6b7b582dd7a..b74c70c0e147 100644
--- a/pages/tools/github-actions.tsx
+++ b/pages/tools/github-actions.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { HeadingLevel, HeadingTypeStyle } from '@/types/typography/Heading';
import GithubButton from '../../components/buttons/GithubButton';
diff --git a/pages/tools/index.tsx b/pages/tools/index.tsx
index 7ed98f27b12f..9c35fc55fa87 100644
--- a/pages/tools/index.tsx
+++ b/pages/tools/index.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import ToolsDashboard from '@/components/tools/ToolsDashboard';
import { HeadingLevel, HeadingTypeStyle } from '@/types/typography/Heading';
diff --git a/pages/tools/parsers.tsx b/pages/tools/parsers.tsx
index d3d83558823e..ff6704ee1097 100644
--- a/pages/tools/parsers.tsx
+++ b/pages/tools/parsers.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
import { HeadingLevel, HeadingTypeStyle } from '@/types/typography/Heading';
import GithubButton from '../../components/buttons/GithubButton';
diff --git a/public/img/posts/2024-blog-banner/blog-banner-september.webp b/public/img/posts/2024-blog-banner/blog-banner-september.webp
new file mode 100644
index 000000000000..36e9a284f676
Binary files /dev/null and b/public/img/posts/2024-blog-banner/blog-banner-september.webp differ
diff --git a/public/img/posts/london-conf-2024/artur.webp b/public/img/posts/london-conf-2024/artur.webp
new file mode 100644
index 000000000000..347ec5bf498a
Binary files /dev/null and b/public/img/posts/london-conf-2024/artur.webp differ
diff --git a/public/img/posts/london-conf-2024/booth-1.webp b/public/img/posts/london-conf-2024/booth-1.webp
new file mode 100644
index 000000000000..15eb9fafed88
Binary files /dev/null and b/public/img/posts/london-conf-2024/booth-1.webp differ
diff --git a/public/img/posts/london-conf-2024/booth-cover.webp b/public/img/posts/london-conf-2024/booth-cover.webp
new file mode 100644
index 000000000000..083b8e39d51e
Binary files /dev/null and b/public/img/posts/london-conf-2024/booth-cover.webp differ
diff --git a/public/img/posts/london-conf-2024/booth-day-1.webp b/public/img/posts/london-conf-2024/booth-day-1.webp
new file mode 100644
index 000000000000..01d0e21f6974
Binary files /dev/null and b/public/img/posts/london-conf-2024/booth-day-1.webp differ
diff --git a/public/img/posts/london-conf-2024/dale.webp b/public/img/posts/london-conf-2024/dale.webp
new file mode 100644
index 000000000000..de2a7f4a9a65
Binary files /dev/null and b/public/img/posts/london-conf-2024/dale.webp differ
diff --git a/public/img/posts/london-conf-2024/eduardo.webp b/public/img/posts/london-conf-2024/eduardo.webp
new file mode 100644
index 000000000000..9ac25a10b8aa
Binary files /dev/null and b/public/img/posts/london-conf-2024/eduardo.webp differ
diff --git a/public/img/posts/london-conf-2024/full-room.webp b/public/img/posts/london-conf-2024/full-room.webp
new file mode 100644
index 000000000000..36394a0eb70f
Binary files /dev/null and b/public/img/posts/london-conf-2024/full-room.webp differ
diff --git a/public/img/posts/london-conf-2024/laurent.webp b/public/img/posts/london-conf-2024/laurent.webp
new file mode 100644
index 000000000000..8b7cba4d8d1b
Binary files /dev/null and b/public/img/posts/london-conf-2024/laurent.webp differ
diff --git a/public/img/posts/london-conf-2024/lorna.webp b/public/img/posts/london-conf-2024/lorna.webp
new file mode 100644
index 000000000000..baa30b1ef247
Binary files /dev/null and b/public/img/posts/london-conf-2024/lorna.webp differ
diff --git a/public/img/posts/london-conf-2024/sho.webp b/public/img/posts/london-conf-2024/sho.webp
new file mode 100644
index 000000000000..7c6f021c04a8
Binary files /dev/null and b/public/img/posts/london-conf-2024/sho.webp differ
diff --git a/public/img/posts/london-conf-2024/swen.webp b/public/img/posts/london-conf-2024/swen.webp
new file mode 100644
index 000000000000..8829eb6b021a
Binary files /dev/null and b/public/img/posts/london-conf-2024/swen.webp differ
diff --git a/public/img/posts/london-conf-2024/will.webp b/public/img/posts/london-conf-2024/will.webp
new file mode 100644
index 000000000000..deae909933e7
Binary files /dev/null and b/public/img/posts/london-conf-2024/will.webp differ
diff --git a/scripts/build-docs.js b/scripts/build-docs.js
index a51971cc2488..ac47b6751cee 100644
--- a/scripts/build-docs.js
+++ b/scripts/build-docs.js
@@ -1,61 +1,65 @@
const sortBy = require('lodash/sortBy')
function buildNavTree(navItems) {
+ try {
const tree = {
'welcome': {
item: { title: 'Welcome', weight: 0, isRootSection: true, isSection: true, rootSectionId: 'welcome', sectionWeight: 0, slug: '/docs' },
children: {}
}
}
-
+
//first we make sure that list of items lists main section items and then sub sections, documents last
- const sortedItems = sortBy(navItems, ['isRootSection', 'weight', 'isSection']);
-
+ const sortedItems = sortBy(navItems, ['isRootSection', 'weight', 'isSection']);
+
sortedItems.forEach(item => {
//identify main sections
if (item.isRootSection) {
tree[item.rootSectionId] = { item, children: {} }
}
-
+
//identify subsections
if (item.parent) {
- tree[item.parent].children[item.sectionId] = { item, children: [] }
+ if (!tree[item.parent]) {
+ throw new Error(`Parent section ${item.parent} not found for item ${item.title}`);
+ }
+ tree[item.parent].children[item.sectionId] = { item, children: [] };
}
-
+
if (!item.isSection) {
if (item.sectionId) {
- let section = tree[item.rootSectionId].children[item.sectionId];
+ let section = tree[item.rootSectionId]?.children[item.sectionId];
if (!section) {
- tree[item.rootSectionId].children[item.sectionId] = { item, children: [] }
+ tree[item.rootSectionId].children[item.sectionId] = { item, children: [] };
}
- tree[item.rootSectionId].children[item.sectionId].children.push(item)
+ tree[item.rootSectionId].children[item.sectionId].children.push(item);
} else {
tree[item.rootSectionId].children[item.title] = { item };
}
}
- })
-
+ });
+
for (const [rootKey, rootValue] of Object.entries(tree)) {
const allChildren = rootValue.children;
const allChildrenKeys = Object.keys(allChildren);
-
+
rootValue.children = allChildrenKeys
.sort((prev, next) => {
return allChildren[prev].item.weight - allChildren[next].item.weight;
- }).reduce(
- (obj, key) => {
- obj[key] = allChildren[key];
- return obj;
- },
- {}
- );
-
+ })
+ .reduce((obj, key) => {
+ obj[key] = allChildren[key];
+ return obj;
+ }, {});
+
//handling subsections
if (allChildrenKeys.length > 1) {
for (const key of allChildrenKeys) {
- allChildren[key].children?.sort((prev, next) => {
- return prev.weight - next.weight;
- });
-
+ if (allChildren[key].children) {
+ allChildren[key].children.sort((prev, next) => {
+ return prev.weight - next.weight;
+ });
+ }
+
// point in slug for specification subgroup to the latest specification version
if (rootKey === 'reference' && key === 'specification') {
allChildren[key].item.href = allChildren[key].children.find(c => c.isPrerelease === undefined).slug;
@@ -63,17 +67,22 @@ function buildNavTree(navItems) {
}
}
}
-
+
return tree;
+
+ } catch (err) {
+ throw new Error(`Failed to build navigation tree: ${err.message}`);
+ }
}
- // A recursion function, works on the logic of Depth First Search to traverse all the root and child posts of the
- // DocTree to get sequential order of the Doc Posts
+// A recursion function, works on the logic of Depth First Search to traverse all the root and child posts of the
+// DocTree to get sequential order of the Doc Posts
const convertDocPosts = (docObject) => {
+ try {
let docsArray = []
// certain entries in the DocPosts are either a parent to many posts or itself a post.
- docsArray.push(docObject?.item || docObject)
- if(docObject.children){
+ docsArray.push(docObject?.item || docObject)
+ if (docObject.children) {
let children = docObject.children
Object.keys(children).forEach((child) => {
let docChildArray = convertDocPosts(children[child])
@@ -81,84 +90,93 @@ const convertDocPosts = (docObject) => {
})
}
return docsArray
+ }
+ catch (err) {
+ throw new Error('Error in convertDocPosts:', err);
+ }
}
-
-function addDocButtons(docPosts, treePosts){
+
+function addDocButtons(docPosts, treePosts) {
let structuredPosts = [];
let rootSections = [];
- // Traversing the whole DocTree and storing each post inside them in sequential order
- Object.keys(treePosts).forEach((rootElement) => {
- structuredPosts.push(treePosts[rootElement].item)
- if(treePosts[rootElement].children){
- let children = treePosts[rootElement].children
- Object.keys(children).forEach((child) => {
- let docChildArray = convertDocPosts(children[child])
- structuredPosts = [...structuredPosts, ...docChildArray]
- })
- }
- })
- // Appending the content of welcome page pf Docs from the posts.json
- structuredPosts[0] = docPosts.filter(p => p.slug === '/docs')[0]
-
- // Traversing the strucutredPosts in order to add `nextPage` and `prevPage` details for each page
- let countDocPages = structuredPosts.length
- structuredPosts = structuredPosts.map((post, index) => {
- // post item specifying the root Section or sub-section in the docs are excluded as
- // they doesn't comprise any Doc Page or content to be shown in website.
- if(post?.isRootSection || post?.isSection || index==0){
- if(post?.isRootSection || index==0)
- rootSections.push(post.title)
- return post
- }
+ try {
+ // Traversing the whole DocTree and storing each post inside them in sequential order
+ Object.keys(treePosts).forEach((rootElement) => {
+ structuredPosts.push(treePosts[rootElement].item);
+ if (treePosts[rootElement].children) {
+ let children = treePosts[rootElement].children;
+ Object.keys(children).forEach((child) => {
+ let docChildArray = convertDocPosts(children[child]);
+ structuredPosts = [...structuredPosts, ...docChildArray];
+ });
+ }
+ });
- let nextPage = {}, prevPage = {}
- let docPost = post;
-
- // checks whether the next page for the current docPost item exists or not
- if(index+1 p.slug === '/docs')[0];
+
+ // Traversing the structuredPosts in order to add `nextPage` and `prevPage` details for each page
+ let countDocPages = structuredPosts.length;
+ structuredPosts = structuredPosts.map((post, index) => {
+ // post item specifying the root Section or sub-section in the docs are excluded as
+ // they doesn't comprise any Doc Page or content to be shown in website.
+ if (post?.isRootSection || post?.isSection || index == 0) {
+ if (post?.isRootSection || index == 0)
+ rootSections.push(post.title)
+ return post
}
- docPost = {...docPost, nextPage}
- }
- // checks whether the previous page for the current docPost item exists or not
- if(index>0){
- // checks whether the previous item inside structuredPosts is a rootElement or a sectionElement
- // if yes, it goes again to a next previous item in structuredPosts to link the prevPage
- if(!structuredPosts[index-1]?.isRootElement && !structuredPosts[index-1]?.isSection){
- prevPage = {
- title: structuredPosts[index-1].title,
- href: structuredPosts[index-1].slug
+ let nextPage = {}, prevPage = {}
+ let docPost = post;
+
+ // checks whether the next page for the current docPost item exists or not
+ if (index + 1 < countDocPages) {
+ // checks whether the next item inside structuredPosts is a rootElement or a sectionElement
+ // if yes, it goes again to a next to next item in structuredPosts to link the nextPage
+ if (!structuredPosts[index + 1].isRootElement && !structuredPosts[index + 1].isSection) {
+ nextPage = {
+ title: structuredPosts[index + 1].title,
+ href: structuredPosts[index + 1].slug
+ }
+ } else {
+ nextPage = {
+ title: `${structuredPosts[index + 1].title} - ${structuredPosts[index + 2].title}`,
+ href: structuredPosts[index + 2].slug
+ }
}
- docPost = {...docPost, prevPage}
- }else{
- // additonal check for the first page of Docs so that it doesn't give any Segementation fault
- if(index-2>=0){
+ docPost = { ...docPost, nextPage }
+ }
+
+ // checks whether the previous page for the current docPost item exists or not
+ if (index > 0) {
+ // checks whether the previous item inside structuredPosts is a rootElement or a sectionElement
+ // if yes, it goes again to a next previous item in structuredPosts to link the prevPage
+ if (!structuredPosts[index - 1]?.isRootElement && !structuredPosts[index - 1]?.isSection) {
prevPage = {
- title: `${structuredPosts[index-1]?.isRootSection ? rootSections[rootSections.length - 2] : rootSections[rootSections.length - 1]} - ${structuredPosts[index-2].title}`,
- href: structuredPosts[index-2].slug
+ title: structuredPosts[index - 1].title,
+ href: structuredPosts[index - 1].slug
+ }
+ docPost = { ...docPost, prevPage }
+ } else {
+ // additonal check for the first page of Docs so that it doesn't give any Segementation fault
+ if (index - 2 >= 0) {
+ prevPage = {
+ title: `${structuredPosts[index - 1]?.isRootSection ? rootSections[rootSections.length - 2] : rootSections[rootSections.length - 1]} - ${structuredPosts[index - 2].title}`,
+ href: structuredPosts[index - 2].slug
+ };
+ docPost = { ...docPost, prevPage };
}
- docPost = {...docPost, prevPage}
}
}
- }
- return docPost
- })
- return structuredPosts
-}
+ return docPost;
+ });
+ } catch (err) {
+ throw new Error("An error occurred while adding doc buttons:", err);
+ }
+ return structuredPosts;
+}
-module.exports = {buildNavTree, addDocButtons, convertDocPosts}
\ No newline at end of file
+module.exports = { buildNavTree, addDocButtons, convertDocPosts }
\ No newline at end of file
diff --git a/scripts/build-tools.js b/scripts/build-tools.js
index 363e34188161..84965815dcc4 100644
--- a/scripts/build-tools.js
+++ b/scripts/build-tools.js
@@ -1,24 +1,33 @@
const { getData } = require('./tools/extract-tools-github');
const { convertTools } = require('./tools/tools-object');
const { combineTools } = require('./tools/combine-tools');
-const manualTools = require('../config/tools-manual.json')
-
const fs = require('fs');
const { resolve } = require('path');
-const buildTools = async () => {
+const buildTools = async (automatedToolsPath, manualToolsPath, toolsPath, tagsPath) => {
try {
let githubExtractData = await getData();
let automatedTools = await convertTools(githubExtractData);
+
fs.writeFileSync(
- resolve(__dirname, '../config', 'tools-automated.json'),
+ automatedToolsPath,
JSON.stringify(automatedTools, null, ' ')
);
- await combineTools(automatedTools, manualTools);
+
+ await combineTools(automatedTools, require(manualToolsPath), toolsPath, tagsPath);
} catch (err) {
- console.log(err);
- throw err
+ throw new Error(`An error occurred while building tools: ${err.message}`);
}
};
-buildTools();
\ No newline at end of file
+/* istanbul ignore next */
+if (require.main === module) {
+ const automatedToolsPath = resolve(__dirname, '../config', 'tools-automated.json');
+ const manualToolsPath = resolve(__dirname, '../config', 'tools-manual.json');
+ const toolsPath = resolve(__dirname, '../config', 'tools.json');
+ const tagsPath = resolve(__dirname, '../config', 'all-tags.json');
+
+ buildTools(automatedToolsPath, manualToolsPath, toolsPath, tagsPath);
+}
+
+module.exports = { buildTools };
diff --git a/scripts/tools/combine-tools.js b/scripts/tools/combine-tools.js
index f929f00095b1..602262428fa1 100644
--- a/scripts/tools/combine-tools.js
+++ b/scripts/tools/combine-tools.js
@@ -5,7 +5,6 @@ const fs = require('fs')
const schema = require("./tools-schema.json");
const Ajv = require("ajv")
const addFormats = require("ajv-formats")
-const { resolve } = require('path');
const Fuse = require("fuse.js");
const ajv = new Ajv()
addFormats(ajv, ["uri"])
@@ -106,7 +105,7 @@ 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) => {
+const combineTools = async (automatedTools, manualTools, toolsPath, tagsPath) => {
for (const key in automatedTools) {
let finalToolsList = [];
if (automatedTools[key].toolsList.length) {
@@ -136,14 +135,8 @@ const combineTools = async (automatedTools, manualTools) => {
finalToolsList.sort((tool, anotherTool) => tool.title.localeCompare(anotherTool.title));
finalTools[key].toolsList = finalToolsList
}
- fs.writeFileSync(
- resolve(__dirname, '../../config', 'tools.json'),
- JSON.stringify(finalTools)
- );
- fs.writeFileSync(
- resolve(__dirname, '../../config', 'all-tags.json'),
- JSON.stringify({ languages: languageList, technologies: technologyList }),
- )
+ fs.writeFileSync(toolsPath,JSON.stringify(finalTools));
+ fs.writeFileSync(tagsPath,JSON.stringify({ languages: languageList, technologies: technologyList }),)
}
module.exports = { combineTools }
\ No newline at end of file
diff --git a/tests/build-docs/addDocButtons.test.js b/tests/build-docs/addDocButtons.test.js
new file mode 100644
index 000000000000..b867d8389549
--- /dev/null
+++ b/tests/build-docs/addDocButtons.test.js
@@ -0,0 +1,91 @@
+const { addDocButtons } = require("../../scripts/build-docs");
+const { docPosts, treePosts, mockDocPosts, mockTreePosts, invalidTreePosts } = require("../fixtures/addDocButtonsData");
+
+describe('addDocButtons', () => {
+ it('should add next and previous page information', () => {
+ const expectedFirstItem = {
+ title: 'Welcome',
+ slug: '/docs',
+ content: 'Welcome content'
+ };
+
+ const expectedSecondItem = {
+ isRootSection: true,
+ title: 'Section 1'
+ };
+
+ const expectedThirdItem = {
+ title: 'Page 1',
+ slug: '/docs/section1/page1',
+ nextPage: {
+ title: 'Page 2',
+ href: '/docs/section1/page2'
+ },
+ prevPage: {
+ title: 'Section 1',
+ href: undefined
+ }
+ };
+
+ const expectedFourthItem = {
+ title: 'Page 2',
+ slug: '/docs/section1/page2',
+ prevPage: {
+ title: 'Page 1',
+ href: '/docs/section1/page1'
+ }
+ };
+
+ const result = addDocButtons(docPosts, treePosts);
+
+ expect(result).toHaveLength(4);
+ expect(result[0]).toEqual(expectedFirstItem);
+ expect(result[1]).toEqual(expectedSecondItem);
+ expect(result[2]).toEqual(expectedThirdItem);
+ expect(result[3]).toEqual(expectedFourthItem);
+ });
+
+ it('should set nextPage correctly when next item is a root element', () => {
+ const result = addDocButtons(mockDocPosts, mockTreePosts);
+
+ expect(result[1].nextPage).toBeDefined();
+ expect(result[1].nextPage.title).toBe('Root 2 - Child 2');
+ expect(result[1].nextPage.href).toBe('/docs/root2/child2');
+ });
+
+ it('should throw an error if treePosts is missing', () => {
+ let error;
+
+ try {
+ addDocButtons(docPosts, undefined);
+ } catch (err) {
+ error = err
+ expect(err.message).toContain("An error occurred while adding doc buttons:");
+ }
+ expect(error).toBeDefined()
+ });
+
+ it('should throw an error if docPosts is missing', () => {
+ let error;
+
+ try {
+ addDocButtons(undefined, treePosts);
+ } catch (err) {
+ error = err
+ expect(err.message).toContain("An error occurred while adding doc buttons:");
+ }
+ expect(error).toBeDefined()
+ });
+
+ it('should handle invalid data structure in treePosts', () => {
+ let error;
+
+ try {
+ addDocButtons(docPosts, invalidTreePosts);
+ } catch (err) {
+ error = err;
+ expect(err.message).toContain("An error occurred while adding doc buttons:");
+ }
+ expect(error).toBeDefined()
+ });
+});
diff --git a/tests/build-docs/buildNavTree.test.js b/tests/build-docs/buildNavTree.test.js
new file mode 100644
index 000000000000..992011be949c
--- /dev/null
+++ b/tests/build-docs/buildNavTree.test.js
@@ -0,0 +1,133 @@
+const { buildNavTree } = require('../../scripts/build-docs');
+
+const {
+ basicNavItems,
+ sectionNavItems,
+ orphanNavItems,
+ missingFieldsNavItems,
+ invalidParentNavItems,
+ multipleSubsectionsNavItems
+} = require('../fixtures/buildNavTreeData')
+
+describe('buildNavTree', () => {
+ beforeEach(() => {
+ jest.clearAllMocks();
+ });
+
+ it('should create a tree structure from nav items', () => {
+
+ const result = buildNavTree(basicNavItems);
+
+ expect(result['welcome'].item).toEqual(
+ expect.objectContaining({
+ title: 'Welcome',
+ slug: '/docs'
+ })
+ );
+
+ expect(result['getting-started'].item).toEqual(
+ expect.objectContaining({
+ title: 'Getting Started',
+ slug: '/docs/getting-started'
+ })
+ );
+
+ expect(result['getting-started'].children).toHaveProperty('installation');
+ expect(result['getting-started'].children).toHaveProperty('configuration');
+
+ expect(result['reference'].item).toEqual(
+ expect.objectContaining({
+ title: 'Reference',
+ slug: '/docs/reference'
+ })
+ );
+
+ expect(result['reference'].children.api.item).toEqual(
+ expect.objectContaining({
+ title: 'API',
+ slug: '/docs/reference/api'
+ })
+ );
+
+ expect(result['reference'].children.specification.item.slug).toBe('/docs/reference/specification');
+ expect(result['reference'].children.specification.children[0].slug).toBe('/docs/reference/specification/v3.0');
+
+ });
+
+ it('should handle items without sectionId', () => {
+
+ const result = buildNavTree(sectionNavItems);
+
+ expect(result['root'].item).toEqual(
+ expect.objectContaining({
+ title: 'Root',
+ slug: '/docs'
+ })
+ );
+
+ expect(result['root'].children).toHaveProperty('Item without sectionId');
+ expect(result['root'].children['Item without sectionId'].item).toEqual(
+ expect.objectContaining({
+ title: 'Item without sectionId',
+ slug: '/docs/item'
+ })
+ );
+ });
+
+ it('should throw and catch an error if a parent section is missing', () => {
+ let error;
+
+ try {
+ buildNavTree(orphanNavItems);
+ } catch (err) {
+ error = err;
+ expect(err.message).toContain('Parent section non-existent-parent not found for item Orphaned Subsection');
+ }
+ expect(error).toBeDefined()
+ });
+
+ it('should handle items with missing required fields gracefully', () => {
+ let error;
+
+ try {
+ buildNavTree(missingFieldsNavItems);
+ } catch (err) {
+ error = err;
+ expect(err.message).toContain('Failed to build navigation tree');
+ }
+ expect(error).toBeDefined();
+ });
+
+ it('should throw an error when parent references are invalid', () => {
+ let error;
+
+ try {
+ buildNavTree(invalidParentNavItems);
+ } catch (err) {
+ error = err;
+ expect(err.message).toContain('Parent section non-existent-parent not found for item Child with invalid parent');
+ }
+ expect(error).toBeDefined();
+ });
+
+ it('should sort children within subsections based on weight', () => {
+ const result = buildNavTree(multipleSubsectionsNavItems);
+
+ const apiChildren = result['reference'].children.api.children;
+ expect(apiChildren[0].title).toBe('Authentication');
+ expect(apiChildren[1].title).toBe('Endpoints');
+ expect(apiChildren[2].title).toBe('Rate Limiting');
+
+ const specChildren = result['reference'].children.specification.children;
+ expect(specChildren[0].title).toBe('v1.0');
+ expect(specChildren[1].title).toBe('v2.0');
+ expect(specChildren[2].title).toBe('v3.0');
+
+ expect(apiChildren[0].weight).toBeLessThan(apiChildren[1].weight);
+ expect(apiChildren[1].weight).toBeLessThan(apiChildren[2].weight);
+
+ expect(specChildren[0].weight).toBeLessThan(specChildren[1].weight);
+ expect(specChildren[1].weight).toBeLessThan(specChildren[2].weight);
+ });
+
+});
diff --git a/tests/build-docs/convertDocPosts.test.js b/tests/build-docs/convertDocPosts.test.js
new file mode 100644
index 000000000000..6cc397ed98b2
--- /dev/null
+++ b/tests/build-docs/convertDocPosts.test.js
@@ -0,0 +1,62 @@
+const { convertDocPosts } = require('../../scripts/build-docs');
+const {
+ docObject,
+ emptyDocObject,
+ singlePostDocObject,
+ nestedChildrenDocObject
+ } = require('../fixtures/convertDocPostData');
+
+describe('convertDocPosts', () => {
+ it('should convert a doc object to an array', () => {
+ const result = convertDocPosts(docObject);
+ expect(result).toHaveLength(3);
+ expect(result[0].title).toBe('Root');
+ expect(result[1].title).toBe('Child 1');
+ expect(result[2].title).toBe('Child 2');
+ });
+
+ it('should return an array with an empty object for an empty doc object', () => {
+ const result = convertDocPosts(emptyDocObject);
+ expect(result).toEqual([{}]);
+ });
+
+ it('should handle a doc object with no children', () => {
+ const result = convertDocPosts(singlePostDocObject);
+ expect(result).toHaveLength(1);
+ expect(result[0].title).toBe('Single Post');
+ });
+
+ it('should handle nested children', () => {
+ const result = convertDocPosts(nestedChildrenDocObject);
+ expect(result).toHaveLength(4);
+ expect(result[0].title).toBe('Root');
+ expect(result[1].title).toBe('Child 1');
+ expect(result[2].title).toBe('Grandchild 1');
+ expect(result[3].title).toBe('Child 2');
+ });
+
+ it('should throw an error if docObject is undefined', () => {
+ let error;
+
+ try {
+ convertDocPosts(undefined);
+ } catch (err) {
+ error = err;
+ expect(err.message).toContain('Error in convertDocPosts:');
+ }
+ expect(error).toBeDefined();
+ });
+
+ it('should throw an error if docObject is null', () => {
+ let error;
+
+ try {
+ convertDocPosts(null);
+ } catch (err) {
+ error = err;
+ expect(err.message).toContain('Error in convertDocPosts:');
+ }
+ expect(error).toBeDefined();
+ });
+
+});
diff --git a/tests/build-tools.test.js b/tests/build-tools.test.js
new file mode 100644
index 000000000000..2bc4592e8e11
--- /dev/null
+++ b/tests/build-tools.test.js
@@ -0,0 +1,89 @@
+const axios = require('axios');
+const { resolve } = require('path');
+const { buildTools } = require('../scripts/build-tools');
+const { tagsData, manualTools, mockConvertedData, mockExtractData } = require('../tests/fixtures/buildToolsData');
+const fs = require('fs');
+
+jest.mock('axios');
+jest.mock('../scripts/tools/categorylist', () => ({
+ categoryList: [
+ { name: 'Category1', description: 'Description for Category1' },
+ { name: 'Category2', description: 'Description for Category2' }
+ ]
+}));
+
+jest.mock('../scripts/tools/tags-color', () => ({
+ languagesColor: [
+ { name: 'JavaScript', color: 'bg-[#f1e05a]', borderColor: 'border-[#f1e05a]' },
+ { name: 'Python', color: 'bg-[#3572A5]', borderColor: 'border-[#3572A5]' }
+ ],
+ technologiesColor: [
+ { name: 'React', color: 'bg-[#61dafb]', borderColor: 'border-[#61dafb]' },
+ { name: 'Node.js', color: 'bg-[#68a063]', borderColor: 'border-[#68a063]' }
+ ]
+}));
+
+describe('buildTools', () => {
+ const testDir = resolve(__dirname, 'test_config');
+ const toolsPath = resolve(testDir, 'tools.json');
+ const tagsPath = resolve(testDir, 'all-tags.json');
+ const automatedToolsPath = resolve(testDir, 'tools-automated.json');
+ const manualToolsPath = resolve(testDir, 'tools-manual.json');
+
+ beforeAll(() => {
+ fs.mkdirSync(testDir, { recursive: true });
+ fs.writeFileSync(manualToolsPath, JSON.stringify(manualTools));
+ });
+
+ afterAll(() => {
+ fs.rmSync(testDir, { recursive: true, force: true });
+ });
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+ });
+
+ it('should extract, convert, combine tools, and write to file', async () => {
+ axios.get.mockResolvedValue({ data: mockExtractData });
+
+ await buildTools(automatedToolsPath, manualToolsPath, toolsPath, tagsPath);
+
+ const automatedToolsContent = JSON.parse(fs.readFileSync(automatedToolsPath, 'utf8'));
+ const combinedToolsContent = JSON.parse(fs.readFileSync(toolsPath, 'utf8'));
+ const tagsContent = JSON.parse(fs.readFileSync(tagsPath, 'utf8'));
+
+ expect(Object.keys(automatedToolsContent)).toEqual(Object.keys(mockConvertedData));
+ expect(automatedToolsContent["Category1"].description).toEqual(mockConvertedData["Category1"].description);
+ expect(automatedToolsContent["Category2"].description).toEqual(mockConvertedData["Category2"].description);
+
+ expect(combinedToolsContent).toHaveProperty('Category1');
+ expect(combinedToolsContent).toHaveProperty('Category2');
+ expect(combinedToolsContent["Category1"].description).toEqual(mockConvertedData["Category1"].description);
+ expect(combinedToolsContent["Category2"].description).toEqual(mockConvertedData["Category2"].description);
+
+ expect(tagsContent).toEqual(tagsData);
+
+ });
+
+ it('should handle getData error', async () => {
+ axios.get.mockRejectedValue(new Error('Extract error'));
+
+ try {
+ await buildTools(automatedToolsPath, manualToolsPath, toolsPath, tagsPath);
+ } catch (err) {
+ expect(err.message).toContain('Extract error');
+ }
+ });
+
+ it('should handle file write errors', async () => {
+ axios.get.mockResolvedValue({ data: mockExtractData });
+
+ const invalidPath = '/invalid_dir/tools.json';
+
+ try {
+ await buildTools(invalidPath, manualToolsPath, toolsPath, tagsPath);
+ } catch (err) {
+ expect(err.message).toMatch(/ENOENT|EACCES/);
+ }
+ });
+});
diff --git a/tests/fixtures/addDocButtonsData.js b/tests/fixtures/addDocButtonsData.js
new file mode 100644
index 000000000000..8b2f437fc9b9
--- /dev/null
+++ b/tests/fixtures/addDocButtonsData.js
@@ -0,0 +1,41 @@
+const docPosts = [
+ { title: 'Welcome', slug: '/docs', content: 'Welcome content' },
+];
+
+const treePosts = {
+ welcome: {
+ item: { title: 'Welcome', isRootSection: true, slug: '/docs' },
+ children: {},
+ },
+ section1: {
+ item: { title: 'Section 1', isRootSection: true },
+ children: {
+ page1: { item: { title: 'Page 1', slug: '/docs/section1/page1' } },
+ page2: { item: { title: 'Page 2', slug: '/docs/section1/page2' } },
+ },
+ },
+};
+
+const mockDocPosts = [
+ { slug: '/docs', title: 'Welcome to Docs' },
+ { slug: '/docs/page1', title: 'Page 1' },
+];
+
+const mockTreePosts = {
+ root1: {
+ item: { title: 'Root 1', isRootSection: true },
+ children: {
+ child1: { item: { title: 'Child 1', slug: '/docs/root1/child1' } },
+ },
+ },
+ root2: {
+ item: { title: 'Root 2', isRootElement: true },
+ children: {
+ child2: { item: { title: 'Child 2', slug: '/docs/root2/child2' } },
+ },
+ },
+};
+
+const invalidTreePosts = ['tree1','tree2','tree3','tree4'];
+
+module.exports = { docPosts, treePosts, mockDocPosts, mockTreePosts, invalidTreePosts };
diff --git a/tests/fixtures/buildNavTreeData.js b/tests/fixtures/buildNavTreeData.js
new file mode 100644
index 000000000000..99638901f810
--- /dev/null
+++ b/tests/fixtures/buildNavTreeData.js
@@ -0,0 +1,45 @@
+module.exports = {
+ basicNavItems: [
+ { title: 'Welcome', weight: 0, isRootSection: true, isSection: true, rootSectionId: 'welcome', sectionWeight: 0, slug: '/docs' },
+ { title: 'Getting Started', weight: 1, isRootSection: true, isSection: true, rootSectionId: 'getting-started', sectionWeight: 1, slug: '/docs/getting-started' },
+ { title: 'Installation', weight: 0, isSection: false, rootSectionId: 'getting-started', sectionId: 'installation', slug: '/docs/getting-started/installation' },
+ { title: 'Configuration', weight: 1, isSection: false, rootSectionId: 'getting-started', sectionId: 'configuration', slug: '/docs/getting-started/configuration' },
+ { title: 'Reference', weight: 2, isRootSection: true, isSection: true, rootSectionId: 'reference', sectionWeight: 2, slug: '/docs/reference' },
+ { title: 'API', weight: 0, isSection: true, rootSectionId: 'reference', sectionId: 'api', parent: 'reference', slug: '/docs/reference/api' },
+ { title: 'Endpoints', weight: 0, isSection: false, rootSectionId: 'reference', sectionId: 'api', slug: '/docs/reference/api/endpoints' },
+ { title: 'Specification', weight: 1, isSection: true, rootSectionId: 'reference', sectionId: 'specification', parent: 'reference', slug: '/docs/reference/specification' },
+ { title: 'v1.0', weight: 0, isSection: false, rootSectionId: 'reference', sectionId: 'specification', slug: '/docs/reference/specification/v1.0', isPrerelease: false },
+ { title: 'v2.0', weight: 1, isSection: false, rootSectionId: 'reference', sectionId: 'specification', slug: '/docs/reference/specification/v2.0', isPrerelease: true },
+ { title: 'v3.0', weight: 2, isSection: false, rootSectionId: 'reference', sectionId: 'specification', slug: '/docs/reference/specification/v3.0' }
+ ],
+
+ sectionNavItems: [
+ { title: 'Root', weight: 0, isRootSection: true, isSection: true, rootSectionId: 'root', sectionWeight: 0, slug: '/docs' },
+ { title: 'Item without sectionId', weight: 1, isSection: false, rootSectionId: 'root', slug: '/docs/item' },
+ ],
+
+ orphanNavItems: [
+ { title: 'Orphaned Subsection', weight: 0, isSection: true, rootSectionId: 'root', sectionId: 'orphan', parent: 'non-existent-parent', slug: '/docs/orphaned' }
+ ],
+
+ missingFieldsNavItems: [
+ { title: 'Incomplete Item', weight: 0, isSection: false, rootSectionId: 'incomplete', slug: '/docs/incomplete' },
+ ],
+
+ invalidParentNavItems: [
+ { title: 'Valid Root', weight: 0, isRootSection: true, isSection: true, rootSectionId: 'valid-root', sectionWeight: 0, slug: '/docs/valid-root' },
+ { title: 'Child with invalid parent', weight: 1, isSection: true, rootSectionId: 'valid-root', sectionId: 'child-invalid', parent: 'non-existent-parent', slug: '/docs/valid-root/child-invalid' },
+ ],
+
+ multipleSubsectionsNavItems: [
+ { title: 'Reference', weight: 0, isRootSection: true, isSection: true, rootSectionId: 'reference', sectionWeight: 0, slug: '/docs/reference' },
+ { title: 'API', weight: 0, isSection: true, rootSectionId: 'reference', sectionId: 'api', parent: 'reference', slug: '/docs/reference/api' },
+ { title: 'Endpoints', weight: 2, isSection: false, rootSectionId: 'reference', sectionId: 'api', slug: '/docs/reference/api/endpoints' },
+ { title: 'Authentication', weight: 1, isSection: false, rootSectionId: 'reference', sectionId: 'api', slug: '/docs/reference/api/authentication' },
+ { title: 'Rate Limiting', weight: 3, isSection: false, rootSectionId: 'reference', sectionId: 'api', slug: '/docs/reference/api/rate-limiting' },
+ { title: 'Specification', weight: 1, isSection: true, rootSectionId: 'reference', sectionId: 'specification', parent: 'reference', slug: '/docs/reference/specification' },
+ { title: 'v1.0', weight: 10, isSection: false, rootSectionId: 'reference', sectionId: 'specification', slug: '/docs/reference/specification/v1.0' },
+ { title: 'v2.0', weight: 20, isSection: false, rootSectionId: 'reference', sectionId: 'specification', slug: '/docs/reference/specification/v2.0' },
+ { title: 'v3.0', weight: 30, isSection: false, rootSectionId: 'reference', sectionId: 'specification', slug: '/docs/reference/specification/v3.0' }
+ ]
+};
\ No newline at end of file
diff --git a/tests/fixtures/buildToolsData.js b/tests/fixtures/buildToolsData.js
new file mode 100644
index 000000000000..e4425815323a
--- /dev/null
+++ b/tests/fixtures/buildToolsData.js
@@ -0,0 +1,84 @@
+const tagsData = {
+ languages: [
+ { name: 'JavaScript', color: 'bg-[#f1e05a]', borderColor: 'border-[#f1e05a]' },
+ { name: 'Python', color: 'bg-[#3572A5]', borderColor: 'border-[#3572A5]' },
+ ],
+ technologies: [
+ { name: 'React', color: 'bg-[#61dafb]', borderColor: 'border-[#61dafb]' },
+ { name: 'Node.js', color: 'bg-[#68a063]', borderColor: 'border-[#68a063]' },
+ ],
+};
+
+const manualTools = [
+ {
+ title: "Manual Tool 1",
+ description: "Description for manual tool 1",
+ links: { repoUrl: "https://github.com/manual/tool1" },
+ filters: { categories: ["Category1"], language: "JavaScript", technology: ["React"] }
+ },
+ {
+ title: "Manual Tool 2",
+ description: "Description for manual tool 2",
+ links: { repoUrl: "https://github.com/manual/tool2" },
+ filters: { categories: ["Category2"], language: "Python", technology: ["Node.js"] }
+ },
+];
+
+const mockConvertedData = {
+ "Category1": {
+ description: "Description for Category1",
+ toolsList: [
+ {
+ title: "Tool 1",
+ description: "Description for tool 1",
+ links: { repoUrl: "https://github.com/tool1" },
+ filters: { categories: ["Category1"], language: "JavaScript", technology: ["React"] }
+ }
+ ]
+ },
+ "Category2": {
+ description: "Description for Category2",
+ toolsList: [
+ {
+ title: "Tool 2",
+ description: "Description for tool 2",
+ links: { repoUrl: "https://github.com/tool2" },
+ filters: { categories: ["Category2"], language: "Python", technology: ["Node.js"] }
+ }
+ ]
+ }
+};
+
+const mockExtractData = {
+ items: [
+ {
+ name: '.asyncapi-tool',
+ url: 'https://api.github.com/repositories/123456/contents/.asyncapi-tool?ref=abcdef',
+ repository: {
+ full_name: 'user/repo1',
+ html_url: 'https://github.com/user/repo1',
+ description: 'Description for repo1',
+ owner: { login: 'asyncapi' }
+ },
+ path: '.asyncapi-tool'
+ },
+ {
+ name: '.asyncapi-tool',
+ url: 'https://api.github.com/repositories/789012/contents/.asyncapi-tool?ref=ghijkl',
+ repository: {
+ full_name: 'user/repo2',
+ html_url: 'https://github.com/user/repo2',
+ description: 'Description for repo2',
+ owner: { login: 'asyncapi' }
+ },
+ path: '.asyncapi-tool'
+ }
+ ]
+};
+
+module.exports = {
+ tagsData,
+ manualTools,
+ mockConvertedData,
+ mockExtractData,
+};
diff --git a/tests/fixtures/convertDocPostData.js b/tests/fixtures/convertDocPostData.js
new file mode 100644
index 000000000000..cf1d8217d6c8
--- /dev/null
+++ b/tests/fixtures/convertDocPostData.js
@@ -0,0 +1,31 @@
+const docObject = {
+ item: { title: 'Root', slug: '/root' },
+ children: {
+ child1: { item: { title: 'Child 1', slug: '/child1' } },
+ child2: { item: { title: 'Child 2', slug: '/child2' } },
+ },
+ };
+
+const emptyDocObject = {};
+
+const singlePostDocObject = { item: { title: 'Single Post', slug: '/single' } };
+
+const nestedChildrenDocObject = {
+ item: { title: 'Root', slug: '/root' },
+ children: {
+ child1: {
+ item: { title: 'Child 1', slug: '/child1' },
+ children: {
+ grandchild1: { item: { title: 'Grandchild 1', slug: '/grandchild1' } },
+ },
+ },
+ child2: { item: { title: 'Child 2', slug: '/child2' } },
+ },
+};
+
+module.exports = {
+ docObject,
+ emptyDocObject,
+ singlePostDocObject,
+ nestedChildrenDocObject
+};
diff --git a/utils/getStatic.ts b/utils/getStatic.ts
index 9b76ba9d4e53..56af2cf6b1ca 100644
--- a/utils/getStatic.ts
+++ b/utils/getStatic.ts
@@ -2,26 +2,24 @@ import { serverSideTranslations } from 'next-i18next/serverSideTranslations';
import i18nextConfig from '../next-i18next.config';
-console.log(i18nextConfig.i18n.locales);
-
/**
* Retrieves the internationalization paths for the supported locales.
* @returns An array of paths for each supported locale.
*/
export const getI18nPaths = () =>
- i18nextConfig.i18n.locales.map((lng) => ({
- params: {
- lang: lng
- }
- }));
+ i18nextConfig.i18n.locales.map((lng) => ({
+ params: {
+ lang: lng
+ }
+ }));
/**
* Retrieves the static paths for Next.js.
* @returns An object containing the fallback value and an array of paths.
*/
export const getStaticPaths = () => ({
- fallback: false,
- paths: getI18nPaths()
+ fallback: false,
+ paths: getI18nPaths()
});
/**
@@ -30,15 +28,13 @@ export const getStaticPaths = () => ({
* @param ns - An array of namespaces to be loaded.
* @returns An object containing the internationalization props.
*/
-export async function getI18nProps(ctx:any, ns = ['common']) {
- const locale = ctx?.params?.lang;
-
- console.log(locale, 'here');
- const props = {
- ...(await serverSideTranslations(locale, ns))
- };
+export async function getI18nProps(ctx: any, ns = ['common']) {
+ const locale = ctx?.params?.lang;
+ const props = {
+ ...(await serverSideTranslations(locale, ns))
+ };
- return props;
+ return props;
}
/**
@@ -47,11 +43,9 @@ export async function getI18nProps(ctx:any, ns = ['common']) {
* @returns A function that retrieves the static props.
*/
export function makeStaticProps(ns = {}) {
- return async function getStaticProps(ctx:any) {
- console.log(ctx, 'ctx');
-
- return {
- props: await getI18nProps(ctx, ns as any)
- };
+ return async function getStaticProps(ctx: any) {
+ return {
+ props: await getI18nProps(ctx, ns as any)
};
+ };
}