diff --git a/.eslintrc.js b/.eslintrc.js index 7f3e3988821..a7ae59ed8d2 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -3,7 +3,7 @@ module.exports = { "browser": true, "es6": true, }, - "extends": ["eslint:recommended", "plugin:react/recommended" , "plugin:cypress/recommended"], + "extends": ["eslint:recommended", "plugin:react/recommended", "plugin:cypress/recommended"], "globals": { "Atomics": "readonly", "SharedArrayBuffer": "readonly", diff --git a/components/Hero.js b/components/Hero.js index b6327942d60..81000be487c 100644 --- a/components/Hero.js +++ b/components/Hero.js @@ -8,18 +8,24 @@ import Heading from './typography/Heading' import Paragraph from './typography/Paragraph' import AlgoliaSearch, { SearchButton } from './AlgoliaSearch'; // Import AlgoliaSearch component import IconLoupe from './icons/Loupe'; +import { + useTranslation, +} from "next-i18next-static-site"; export default function Hero({ className = ''}) { + + const { t } = useTranslation(); + return ( <>
- Building the future of {` `} + {t('main.header')} {` `} {" "} - Event-Driven Architectures (EDA) + {t('main.subHeader')} @@ -69,5 +75,4 @@ export default function Hero({ className = ''}) {
); -} - +} \ No newline at end of file diff --git a/components/community/Card.js b/components/community/Card.js index b5be16046b9..ee743c45c87 100644 --- a/components/community/Card.js +++ b/components/community/Card.js @@ -11,7 +11,7 @@ export default function SmallHomeCards({icon, tagline, taglineBg, type="large",
+ data-testid="Card-small-bg">
{icon} {tagline}
@@ -41,10 +41,10 @@ export default function SmallHomeCards({icon, tagline, taglineBg, type="large", className={`h-140 w-full shadow-xl rounded p-6 border ${ !bg && 'border-[#ad20e2]' } ${bg}`} - > + data-testid="Card-lg-bg">
+ data-testid="Card-lg-tagline"> {icon} {tagline}
@@ -62,7 +62,7 @@ export default function SmallHomeCards({icon, tagline, taglineBg, type="large",
- +
{' '} {btnText} diff --git a/components/editor/CodeBlock.js b/components/editor/CodeBlock.js index b0e19db2234..974c2285c52 100644 --- a/components/editor/CodeBlock.js +++ b/components/editor/CodeBlock.js @@ -104,8 +104,8 @@ export default function CodeBlock({ { showCopy && (
-
diff --git a/components/languageSelector/LanguageSelect.js b/components/languageSelector/LanguageSelect.js new file mode 100644 index 00000000000..b8d931a7d6f --- /dev/null +++ b/components/languageSelector/LanguageSelect.js @@ -0,0 +1,21 @@ +import { twMerge } from 'tailwind-merge' +export default function LanguageSelect({ + className = '', + onChange = () => { }, + options = [], + selected, +}) { + return ( + + ) +} \ No newline at end of file diff --git a/components/link.js b/components/link.js new file mode 100644 index 00000000000..4fe488bf107 --- /dev/null +++ b/components/link.js @@ -0,0 +1,48 @@ +import Link from "next/link"; +import { useRouter } from "next/router"; +import { defaultLanguage, languages } from "next-i18next-static-site"; + +const LinkComponent = ({ children, locale, ...props }) => { + const router = useRouter(); + const { pathname, query, asPath } = router; + + // Detect current language + const slug = asPath.split("/")[1]; + const langSlug = languages.includes(slug) && slug; + const language = query.lang || langSlug || defaultLanguage; + + let href = props.href || pathname; + + if (locale) { + if (props.href) { + href = `/${locale}${href}`; + } else { + if (pathname.startsWith("/404")) { + href = `/${locale}`; + } else { + href = pathname.replace("[lang]", locale); + } + } + } else { + if (language) { + href = `/${language}${href}`; + } else { + href = `/${href}`; + } + } + + // Fix double slashes + href = href.replace(/([^:]\/)\/+/g, "$1").replace("//", "/"); + + return ( + + {children} + + ); +}; + +export const LinkText = ({ href, children, ...props }) => { + return {children}; +}; + +export default LinkComponent; \ No newline at end of file diff --git a/components/navigation/DocsNavItem.js b/components/navigation/DocsNavItem.js index dcf17037f70..7f32090de04 100644 --- a/components/navigation/DocsNavItem.js +++ b/components/navigation/DocsNavItem.js @@ -1,25 +1,25 @@ import Link from 'next/link'; function isActiveSlug(slug, activeSlug, sectionSlug) { - if(slug === '/docs' || (sectionSlug !== undefined && slug === sectionSlug)) { + if (slug === '/docs' || (sectionSlug !== undefined && slug === sectionSlug)) { return (slug == activeSlug) } - + const partialSlug = slug.split('/'); const partialActiveSlug = activeSlug.split('/'); const activeParts = partialActiveSlug.filter((a, idx) => a === partialSlug[idx]); return activeParts.length === partialSlug.length; } -export default function DocsNavItem({ title, slug, href, activeSlug, sectionSlug, onClick = () => {}, defaultClassName = '', inactiveClassName = '', activeClassName = '', bucket }) { +export default function DocsNavItem({ title, slug, href, activeSlug, sectionSlug, onClick = () => { }, defaultClassName = '', inactiveClassName = '', activeClassName = '', bucket }) { const isActive = isActiveSlug(slug, activeSlug, sectionSlug); - const classes = `${isActive ? activeClassName : inactiveClassName} ${defaultClassName} inline-block`; + const classes = `${isActive ? activeClassName : inactiveClassName} ${defaultClassName} inline-block w-full`; return ( -
+
); -} \ No newline at end of file +} diff --git a/components/navigation/EventFilter.js b/components/navigation/EventFilter.js index c801fb4a5ce..2ddce66b18e 100644 --- a/components/navigation/EventFilter.js +++ b/components/navigation/EventFilter.js @@ -29,9 +29,9 @@ function EventFilter({ data, setData }) { } }, [active]); return ( -
+
{filterList.map((list) => ( -
+
  • ({ + key: repo, + text: repo, +})); export default function NavBar({ className = '', hideLogo = false, }) { - const { asPath } = useRouter(); + const router = useRouter(); + const { pathname, query, asPath } = router; const [open, setOpen] = useState(); const [mobileMenuOpen, setMobileMenuOpen] = useState(); + const [lang, setLang] = useState("en"); + const { i18n } = useTranslation(); + + const changeLanguage = async (locale) => { + // Detect current language + const slug = asPath.split("/")[1]; + const langSlug = languages.includes(slug) && slug; + const language = query.lang || langSlug || defaultLanguage; + + let href = pathname; + + if (locale) { + if (pathname.startsWith("/404")) { + href = `/${locale}`; + } else { + href = pathname.replace("[lang]", locale); + } + } else { + if (language) { + href = `/${language}${href}`; + } else { + href = `/${href}`; + } + } + + // Fix double slashes + href = href.replace(/([^:]\/)\/+/g, "$1").replace("//", "/"); + + router.push(href); + }; function outsideClick(menu) { if (open !== menu) return; @@ -107,9 +148,9 @@ export default function NavBar({
    showMenu(null)} ref={communityRef}> showOnClickMenu('community')} - onMouseEnter={() => showMenu('community')} + href="/community" + onClick={() => showOnClickMenu('community')} + onMouseEnter={() => showMenu('community')} hasDropdown /> {open === 'community' && } @@ -127,6 +168,17 @@ export default function NavBar({ + {/* // Language Picker Component */} + {/* { + setLang(value.toLowerCase()); + changeLanguage(value.toLowerCase()); + }} + className="" + selected={i18n.language.toLocaleUpperCase()} + /> */} +
    diff --git a/config/all-tags.json b/config/all-tags.json index fcc2f8108b9..d4e7190245b 100644 --- a/config/all-tags.json +++ b/config/all-tags.json @@ -1 +1 @@ -{"languages":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"},{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"},{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"},{"name":"HTML","color":"bg-[#E2A291]","borderColor":"border-[#E44D26]"},{"name":"C/C++","color":"bg-[#93CDEF]","borderColor":"border-[#0080CC]"},{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"},{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"},{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"},{"name":"Kotlin","color":"bg-[#B1ACDF]","borderColor":"border-[#756BD9]"},{"name":"Scala","color":"bg-[#FFA299]","borderColor":"border-[#DF301F]"},{"name":"Markdown","color":"bg-[#BABEBF]","borderColor":"border-[#445B64]"},{"name":"YAML","color":"bg-[#FFB764]","borderColor":"border-[#F1901F]"},{"name":"R","color":"bg-[#84B5ED]","borderColor":"border-[#246BBE]"},{"name":"Ruby","color":"bg-[#FF8289]","borderColor":"border-[#FF000F]"},{"name":"Rust","color":"bg-[#FFB8AA]","borderColor":"border-[#E43716]"},{"name":"Shell","color":"bg-[#87D4FF]","borderColor":"border-[#389ED7]"},{"name":"Groovy","color":"bg-[#B6D5E5]","borderColor":"border-[#609DBC]"}],"technologies":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Hermes","color":"bg-[#8AEEBD]","borderColor":"border-[#2AB672]"},{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"},{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"},{"name":"AWS","color":"bg-[#FF9F59]","borderColor":"border-[#EF6703]"},{"name":"Docker","color":"bg-[#B8E0FF]","borderColor":"border-[#2596ED]"},{"name":"Node-RED","color":"bg-[#FF7474]","borderColor":"border-[#8F0101]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Saas","color":"bg-[#6AB8EC]","borderColor":"border-[#2275AD]"},{"name":"Kubernetes-native","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Scala","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Azure","color":"bg-[#4B93FF]","borderColor":"border-[#015ADF]"},{"name":"Jenkins","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Socket.IO","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Kotlin","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Groovy","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Markdown","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Shell","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"WebComponents","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Babel","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Storybook","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"AsyncAPI Generator","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JetBrains","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"IntelliJ IDEA","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"VSCode","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"SmartPaste","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}]} \ No newline at end of file +{"languages":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"},{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"},{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"},{"name":"HTML","color":"bg-[#E2A291]","borderColor":"border-[#E44D26]"},{"name":"C/C++","color":"bg-[#93CDEF]","borderColor":"border-[#0080CC]"},{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"},{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"},{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"},{"name":"Kotlin","color":"bg-[#B1ACDF]","borderColor":"border-[#756BD9]"},{"name":"Scala","color":"bg-[#FFA299]","borderColor":"border-[#DF301F]"},{"name":"Markdown","color":"bg-[#BABEBF]","borderColor":"border-[#445B64]"},{"name":"YAML","color":"bg-[#FFB764]","borderColor":"border-[#F1901F]"},{"name":"R","color":"bg-[#84B5ED]","borderColor":"border-[#246BBE]"},{"name":"Ruby","color":"bg-[#FF8289]","borderColor":"border-[#FF000F]"},{"name":"Rust","color":"bg-[#FFB8AA]","borderColor":"border-[#E43716]"},{"name":"Shell","color":"bg-[#87D4FF]","borderColor":"border-[#389ED7]"},{"name":"Groovy","color":"bg-[#B6D5E5]","borderColor":"border-[#609DBC]"}],"technologies":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Hermes","color":"bg-[#8AEEBD]","borderColor":"border-[#2AB672]"},{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"},{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"},{"name":"AWS","color":"bg-[#FF9F59]","borderColor":"border-[#EF6703]"},{"name":"Docker","color":"bg-[#B8E0FF]","borderColor":"border-[#2596ED]"},{"name":"Node-RED","color":"bg-[#FF7474]","borderColor":"border-[#8F0101]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Saas","color":"bg-[#6AB8EC]","borderColor":"border-[#2275AD]"},{"name":"Kubernetes-native","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Scala","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Azure","color":"bg-[#4B93FF]","borderColor":"border-[#015ADF]"},{"name":"Jenkins","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Nest Js","color":"bg-[#E1224E]","borderColor":"border-[#B9012b]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Socket.IO","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Kotlin","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Groovy","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Markdown","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Shell","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"WebComponents","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Babel","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Storybook","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"AsyncAPI Generator","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JetBrains","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"IntelliJ IDEA","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"VSCode","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"SmartPaste","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}]} \ No newline at end of file diff --git a/config/meetings.json b/config/meetings.json index 6135d1515bf..4ff41cecd08 100644 --- a/config/meetings.json +++ b/config/meetings.json @@ -1,24 +1,4 @@ [ - { - "title": "Spec 3.0 Meeting", - "calLink": "https://www.google.com/calendar/event?eid=djhsdjZvbmRsampvb2tsYzhkZWFyc3FtYTAgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", - "url": "https://github.com/asyncapi/community/issues/649", - "date": "2023-04-13T15:00:00.000Z" - }, - { - "title": "Community Meeting", - "calLink": "https://www.google.com/calendar/event?eid=MzgwdmZiMTc4cnBmbTUzdWVlbmM4aWYyM2MgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", - "url": "https://github.com/asyncapi/community/issues/659", - "banner": "https://user-images.githubusercontent.com/40604284/229763606-c0b6ed3b-e120-427c-b87d-357856d92777.png", - "date": "2023-04-18T16:00:00.000Z" - }, - { - "title": "Adding support for non-JSON schemas", - "calLink": "https://www.google.com/calendar/event?eid=dTlrM2s3Nmpqcjk2bWszYW83NmJzNnN0cm8gY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", - "url": "https://github.com/asyncapi/community/issues/668", - "banner": "", - "date": "2023-04-18T14:00:00.000Z" - }, { "title": "Spec 3.0 Meeting", "calLink": "https://www.google.com/calendar/event?eid=Z2l0am1xbTBhcm8xa2sxc2dyOGdoaXRmZTQgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", @@ -235,5 +215,19 @@ "url": "https://github.com/asyncapi/community/issues/800", "banner": "", "date": "2023-07-18T08:00:00.000Z" + }, + { + "title": "Spec 3.0 Meeting", + "calLink": "https://www.google.com/calendar/event?eid=aTBkZHJ2YWczcG1hZWFqbTFlMWowZjZnbzAgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/812", + "banner": "", + "date": "2023-08-02T16:00:00.000Z" + }, + { + "title": "Community Meeting", + "calLink": "https://www.google.com/calendar/event?eid=YmlybTZwODdmMzBnNGg0b3J1OWxmdnBxNmMgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/818", + "banner": "https://user-images.githubusercontent.com/40604284/256949583-958c34c8-4256-4ac5-852b-e00ec094fad0.png", + "date": "2023-08-08T16:00:00.000Z" } ] \ No newline at end of file diff --git a/config/newsroom_videos.json b/config/newsroom_videos.json index 35c05ac0d27..3eda25f1a2d 100644 --- a/config/newsroom_videos.json +++ b/config/newsroom_videos.json @@ -1,15 +1,9 @@ [ { - "image_url": "https://i.ytimg.com/vi/a2luTxpmkfs/hqdefault.jpg", - "title": "Spec 3.0 Docs (July 20th 2023)", - "description": "https://github.com/asyncapi/community/issues/790.", - "videoId": "a2luTxpmkfs" - }, - { - "image_url": "https://i.ytimg.com/vi/5ldSHhDI95E/hqdefault.jpg", - "title": "Spec 3.0 (July 19th 2023)", - "description": "https://github.com/asyncapi/community/issues/761.", - "videoId": "5ldSHhDI95E" + "image_url": "https://i.ytimg.com/vi/CagY5otdY14/hqdefault.jpg", + "title": "Community Meeting (July 25th 2023)", + "description": "https://github.com/asyncapi/community/issues/798.", + "videoId": "CagY5otdY14" }, { "image_url": "https://i.ytimg.com/vi/GAjlJFXjMh8/hqdefault.jpg", @@ -28,5 +22,11 @@ "title": "Community Meeting (July 11th 2023)", "description": "https://github.com/asyncapi/community/issues/784.", "videoId": "5o5BHJqGxIg" + }, + { + "image_url": "https://i.ytimg.com/vi/Lunp8eSLONc/hqdefault.jpg", + "title": "Spec 3.0 DOCS Meeting (July 6th 2023)", + "description": "https://github.com/asyncapi/community/issues/774.", + "videoId": "Lunp8eSLONc" } ] \ No newline at end of file diff --git a/config/tools-automated.json b/config/tools-automated.json index 1a91ef8f5fa..b499a62b339 100644 --- a/config/tools-automated.json +++ b/config/tools-automated.json @@ -2,6 +2,26 @@ "APIs": { "description": "The following is a list of APIs that expose functionality related to AsyncAPI.", "toolsList": [ + { + "title": "AsyncAPI Server API", + "description": "Server API providing official AsyncAPI tools", + "links": { + "websiteUrl": "https://api.asyncapi.com/v1", + "docsUrl": "https://api.asyncapi.com/v1/docs", + "repoUrl": "https://github.com/asyncapi/server-api" + }, + "filters": { + "technology": [ + "Node.js", + "TypeScript" + ], + "categories": [ + "api" + ], + "hasCommercial": false, + "isAsyncAPIOwner": true + } + }, { "title": "SIO-AsyncAPI", "description": "This is code-first approach to generate AsyncAPI specification from Socket.IO server.", @@ -30,22 +50,22 @@ "description": "The following is a list of tools that generate AsyncAPI documents from your code.", "toolsList": [ { - "title": "SIO-AsyncAPI", - "description": "This is code-first approach to generate AsyncAPI specification from Socket.IO server.", + "title": "AsyncAPI.Net", + "description": "The AsyncAPI.NET SDK contains a useful object model for AsyncAPI documents in .NET along with common serializers to extract raw OpenAPI JSON and YAML documents from the model.", "links": { - "websiteUrl": "https://github.com/daler-rahimov/sio-asyncapi", - "docsUrl": "https://github.com/daler-rahimov/sio-asyncapi", - "repoUrl": "https://github.com/daler-rahimov/sio-asyncapi" + "websiteUrl": "https://github.com/LEGO/AsyncAPI.NET/", + "repoUrl": "https://github.com/LEGO/AsyncAPI.NET" }, "filters": { - "language": "Python", + "language": "C#", "technology": [ - "Socket.IO", - "Flask" + ".NET", + "ASP.NET" ], "categories": [ + "converters", "code-first", - "api" + "validator" ], "hasCommercial": false, "isAsyncAPIOwner": false @@ -69,6 +89,28 @@ "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": "Python", + "technology": [ + "Socket.IO", + "Flask" + ], + "categories": [ + "code-first", + "api" + ], + "hasCommercial": false, + "isAsyncAPIOwner": false + } } ] }, @@ -120,7 +162,30 @@ }, "Converters": { "description": "The following is a list of tools that do not yet belong to any specific category but are also useful for the community.", - "toolsList": [] + "toolsList": [ + { + "title": "AsyncAPI.Net", + "description": "The AsyncAPI.NET SDK contains a useful object model for AsyncAPI documents in .NET along with common serializers to extract raw OpenAPI JSON and YAML documents from the model.", + "links": { + "websiteUrl": "https://github.com/LEGO/AsyncAPI.NET/", + "repoUrl": "https://github.com/LEGO/AsyncAPI.NET" + }, + "filters": { + "language": "C#", + "technology": [ + ".NET", + "ASP.NET" + ], + "categories": [ + "converters", + "code-first", + "validator" + ], + "hasCommercial": false, + "isAsyncAPIOwner": false + } + } + ] }, "Directories": { "description": "The following is a list of directories that index public AsyncAPI documents.", @@ -132,7 +197,27 @@ }, "Editors": { "description": "The following is a list of editors or related tools that allow editing of AsyncAPI document.", - "toolsList": [] + "toolsList": [ + { + "title": "AsyncAPI Studio", + "description": "Visually design your AsyncAPI files and event-driven architecture.", + "links": { + "websiteUrl": "https://studio.asyncapi.com", + "repoUrl": "https://github.com/asyncapi/studio" + }, + "filters": { + "technology": [ + "React JS", + "TypeScript" + ], + "categories": [ + "editor" + ], + "hasCommercial": false, + "isAsyncAPIOwner": true + } + } + ] }, "UI components": { "description": "The following is a list of UI components to view AsyncAPI documents.", @@ -196,6 +281,23 @@ "GitHub Actions": { "description": "The following is a list of GitHub Actions that you can use in your workflows", "toolsList": [ + { + "title": "GitHub Action for Generator", + "description": "GitHub Action to generate all the things from your AsyncAPI document using the AsyncAPI generator", + "links": { + "repoUrl": "https://github.com/asyncapi/github-action-for-generator" + }, + "filters": { + "technology": [ + "AsyncAPI Generator" + ], + "categories": [ + "github-action" + ], + "hasCommercial": false, + "isAsyncAPIOwner": true + } + }, { "title": "GitHub Action for Generator", "description": null, @@ -218,6 +320,26 @@ "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": "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.in", + "docsUrl": "https://specmatic.in/documentation/", + "repoUrl": "https://github.com/znsio/specmatic" + }, + "filters": { + "language": "kotlin", + "technology": [ + "maven" + ], + "categories": [ + "mocking-and-testing" + ], + "hasCommercial": false, + "isAsyncAPIOwner": false + } + }, { "title": "ZenWave SDK", "description": "DDD and API-First for Event-Driven Microservices", @@ -248,7 +370,30 @@ }, "Validators": { "description": "The following is a list of tools that validate AsyncAPI documents.", - "toolsList": [] + "toolsList": [ + { + "title": "AsyncAPI.Net", + "description": "The AsyncAPI.NET SDK contains a useful object model for AsyncAPI documents in .NET along with common serializers to extract raw OpenAPI JSON and YAML documents from the model.", + "links": { + "websiteUrl": "https://github.com/LEGO/AsyncAPI.NET/", + "repoUrl": "https://github.com/LEGO/AsyncAPI.NET" + }, + "filters": { + "language": "C#", + "technology": [ + ".NET", + "ASP.NET" + ], + "categories": [ + "converters", + "code-first", + "validator" + ], + "hasCommercial": false, + "isAsyncAPIOwner": false + } + } + ] }, "Compare tools": { "description": "The following is a list of tools that compare AsyncAPI documents.", @@ -276,6 +421,25 @@ "CLIs": { "description": "The following is a list of tools that you can work with in terminal or do some CI/CD automation.", "toolsList": [ + { + "title": "AsyncAPI CLI", + "description": "One CLI to rule them all. \nThis is a CLI that aims to integrate all AsyncAPI tools that you need while AsyncAPI document development and maintainance. \nYou can use it to generate docs or code, validate AsyncAPI document and event create new documents.\n", + "links": { + "websiteUrl": "https://www.asyncapi.com/tools/cli", + "repoUrl": "https://github.com/asyncapi/cli" + }, + "filters": { + "technology": [ + "TypeScript" + ], + "categories": [ + "others", + "cli" + ], + "hasCommercial": false, + "isAsyncAPIOwner": true + } + }, { "title": "ZenWave SDK", "description": "DDD and API-First for Event-Driven Microservices", @@ -301,25 +465,6 @@ "hasCommercial": false, "isAsyncAPIOwner": false } - }, - { - "title": "AsyncAPI CLI", - "description": "One CLI to rule them all. \nThis is a CLI that aims to integrate all AsyncAPI tools that you need while AsyncAPI document development and maintainance. \nYou can use it to generate docs or code, validate AsyncAPI document and event create new documents.\n", - "links": { - "websiteUrl": "https://www.asyncapi.com/tools/cli", - "repoUrl": "https://github.com/asyncapi/cli" - }, - "filters": { - "technology": [ - "TypeScript" - ], - "categories": [ - "others", - "cli" - ], - "hasCommercial": false, - "isAsyncAPIOwner": true - } } ] }, diff --git a/config/tools.json b/config/tools.json index faef2b3ec84..9c6fd3d6042 100644 --- a/config/tools.json +++ b/config/tools.json @@ -1 +1 @@ -{"APIs":{"description":"The following is a list of APIs that expose functionality related to AsyncAPI.","toolsList":[{"title":"API Tracker - AsyncAPI specs","description":"Explore APIs and companies with public AsyncAPI specifications.","links":{"websiteUrl":"https://apitracker.io/specifications/asyncapi","repoUrl":""},"filters":{"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI-Directory by APIs.guru","description":"Directory of asynchronous API specifications in AsyncAPI format.","links":{"websiteUrl":"https://apis.guru/asyncapi-directory/","repoUrl":"https://github.com/APIs-guru/asyncapi-directory"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"SIO-AsyncAPI","description":"This is code-first approach to generate AsyncAPI specification from Socket.IO server.","links":{"websiteUrl":"https://github.com/daler-rahimov/sio-asyncapi","docsUrl":"https://github.com/daler-rahimov/sio-asyncapi","repoUrl":"https://github.com/daler-rahimov/sio-asyncapi"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"technology":[{"name":"Socket.IO","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["code-first","api"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Code-first tools":{"description":"The following is a list of tools that generate AsyncAPI documents from your code.","toolsList":[{"title":"EventBridge Atlas","description":"Tool that translates your AWS EventBridge Schemas into an AsyncAPI document and a web UI.","links":{"websiteUrl":"https://eventbridge-atlas.netlify.app/","repoUrl":"https://github.com/boyney123/eventbridge-atlas"},"filters":{"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Go AsyncAPI","description":"This library helps to create AsyncAPI spec from your Go message structures. It uses reflection to translate Go structures in JSON Schema definitions and arrange them in AsyncAPI schema.","links":{"repoUrl":"https://github.com/swaggest/go-asyncapi"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"Java AsyncAPI","description":"This tool stores modules, which simplifies interacting with AsyncAPI in jvm ecosystem.","links":{"repoUrl":"https://github.com/asyncapi/jasyncapi"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Kotlin","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"KnstEventBus","description":"AsyncApi code-first tools for c#. Generates document and view.","links":{"repoUrl":"https://github.com/d0972058277/KnstEventBus"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"},{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Kotlin AsyncAPI","description":"The Kotlin AsyncAPI project aims to provide convenience tools for generating and serving AsyncAPI documentation. The core of this project is a Kotlin DSL for building the specification in a typesafe way.","links":{"repoUrl":"https://github.com/OpenFolder/kotlin-asyncapi"},"filters":{"language":[{"name":"Kotlin","color":"bg-[#B1ACDF]","borderColor":"border-[#756BD9]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"nestjs-asyncapi","description":"Utilize decorators to generate AsyncAPI document utilizing DTOs (similar to @nestjs/swagger) and a web UI.","links":{"repoUrl":"https://github.com/flamewow/nestjs-asyncapi"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Kubernetes-native","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Neuroglia AsyncAPI","description":"A .NET SDK for the Async API specification. Automatically generates and serves AsyncAPI documents based on your code. Includes fluent-builders to create AsyncAPI documents from scratch, and provides a web-based GUI to browse generated documents.","links":{"repoUrl":"https://github.com/neuroglia-io/AsyncApi"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Saunter","description":"Saunter is an AsyncAPI documentation generator for dotnet. Generates (and hosts) an AsyncAPI schema document from your code.","links":{"repoUrl":"https://github.com/tehmantra/saunter"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"SIO-AsyncAPI","description":"This is code-first approach to generate AsyncAPI specification from Socket.IO server.","links":{"websiteUrl":"https://github.com/daler-rahimov/sio-asyncapi","docsUrl":"https://github.com/daler-rahimov/sio-asyncapi","repoUrl":"https://github.com/daler-rahimov/sio-asyncapi"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"technology":[{"name":"Socket.IO","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["code-first","api"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Springwolf","description":"Automated documentation for async APIs built with Spring Boot. Like Springfox for AsyncAPI. Auto-generates an AsyncAPI document and a web UI.","links":{"websiteUrl":"https://springwolf.github.io/","repoUrl":"https://github.com/springwolf/springwolf-core"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"sttp tapir","description":"Library for describing HTTP endpoints, and then interpreting them as a server, client, or documentation","links":{"websiteUrl":"https://tapir.softwaremill.com/","repoUrl":"https://github.com/softwaremill/tapir"},"filters":{"language":[{"name":"Scala","color":"bg-[#FFA299]","borderColor":"border-[#DF301F]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}}]},"Code Generators":{"description":"The following is a list of tools that generate code from an AsyncAPI document; not the other way around.","toolsList":[{"title":"AsyncAPI Generator","description":"Generator is a tool that you can use to generate whatever you want basing on the AsyncAPI specification file as an input.","links":{"docsUrl":"https://www.asyncapi.com/docs/tools/generator","repoUrl":"https://github.com/asyncapi/generator"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["code-generator","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Golang AsyncAPI Code Generator","description":"Generate Go client and server boilerplate from AsyncAPI specifications. Can be called from `go generate` without requirements.\n","links":{"repoUrl":"https://github.com/lerenn/asyncapi-codegen"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"MultiAPI Generator","description":"This is a plugin designed to help developers automatizing the creation of code classes from YML files based on AsyncApi and OpenAPI. It is presented in 2 flavours Maven and Gradle","links":{"repoUrl":"https://github.com/sngular/scs-multiapi-plugin"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Groovy","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Node-RED AsyncAPI plugin","description":"A plugin for generating and configuring nodes for Kafka, MQTT, AMQP, etc. automatically from an AsyncAPI specification.","links":{"repoUrl":"https://github.com/dalelane/node-red-contrib-plugin-asyncapi"},"filters":{"technology":[{"name":"Node-RED","color":"bg-[#FF7474]","borderColor":"border-[#8F0101]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Converters":{"description":"The following is a list of tools that do not yet belong to any specific category but are also useful for the community.","toolsList":[{"title":"AsyncAPI-format","description":"Format an AsyncAPI document by ordering, casing, formatting, and filtering fields.","links":{"repoUrl":"https://github.com/thim81/asyncapi-format"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["converter","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Converter","description":"Converts old versions of AsyncAPI files into the latest version.","links":{"repoUrl":"https://github.com/asyncapi/converter-js"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["converter"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Converter-Go","description":"The AsyncAPI Converter converts AsyncAPI documents from versions 1.0.0, 1.1.0 and 1.2.0 to version 2.0.0. It supports both json and yaml formats on input and output. By default, the AsyncAPI Converter converts a document into the json format.","links":{"repoUrl":"https://github.com/asyncapi/converter-go"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["converter"],"hasCommercial":false,"isAsyncAPIOwner":true,"technology":[]}}]},"Directories":{"description":"The following is a list of directories that index public AsyncAPI documents.","toolsList":[{"title":"API Tracker - AsyncAPI specs","description":"Explore APIs and companies with public AsyncAPI specifications.","links":{"websiteUrl":"https://apitracker.io/specifications/asyncapi","repoUrl":""},"filters":{"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI-Directory by APIs.guru","description":"Directory of asynchronous API specifications in AsyncAPI format.","links":{"websiteUrl":"https://apis.guru/asyncapi-directory/","repoUrl":"https://github.com/APIs-guru/asyncapi-directory"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Documentation Generators":{"description":"The following is a list of tools that generate human-readable documentation from an AsyncAPI document.","toolsList":[{"title":"AsyncAPI Generator","description":"Generator is a tool that you can use to generate whatever you want basing on the AsyncAPI specification file as an input.","links":{"docsUrl":"https://www.asyncapi.com/docs/tools/generator","repoUrl":"https://github.com/asyncapi/generator"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Markdown","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"asyncapi-asciidoc-template","description":"Asciidoc template for the asyncapi generator","links":{"repoUrl":"https://gitlab.com/djencks/asyncapi-asciidoc-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"}],"categories":["documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Bump.sh","description":"OpenAPI 2 & 3 / AsyncAPI 2 documentation generator, with automatic changelog and visual diff.","links":{"websiteUrl":"https://bump.sh/","repoUrl":""},"filters":{"categories":["documentation-generator"],"hasCommercial":true,"isAsyncAPIOwner":false,"technology":[]}},{"title":"Cupid","description":"A library that focuses on finding and analyzing the relationships between AsyncAPI documents. It outputs a map of the system architecture.","links":{"repoUrl":"https://github.com/asyncapi/cupid"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"KnstEventBus","description":"AsyncApi code-first tools for c#. Generates document and view.","links":{"repoUrl":"https://github.com/d0972058277/KnstEventBus"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"},{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Springwolf","description":"Automated documentation for async APIs built with Spring Boot. Like Springfox for AsyncAPI. Auto-generates an AsyncAPI document and a web UI.","links":{"websiteUrl":"https://springwolf.github.io/","repoUrl":"https://github.com/springwolf/springwolf-core"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Widdershins","description":"OpenAPI 3.0 / Swagger 2.0 / AsyncAPI 1.0 definition to Slate / Shins compatible markdown.","links":{"websiteUrl":"https://mermade.github.io/reslate/","repoUrl":"https://github.com/Mermade/widdershins"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Shell","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Editors":{"description":"The following is a list of editors or related tools that allow editing of AsyncAPI document.","toolsList":[]},"UI components":{"description":"The following is a list of UI components to view AsyncAPI documents.","toolsList":[{"title":"Api-Diff-Viewer","description":"React component to view the difference between two Json based API documents. Supported specifications: JsonSchema, OpenAPI 3.x, AsyncAPI 2.x.","links":{"repoUrl":"https://github.com/udamir/api-diff-viewer","websiteUrl":"https://api-diff-viewer.vercel.app/"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":"Babel","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Storybook","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ui-component"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI React component","description":"React component for rendering documentation from your specification in real-time in the browser. It also provides a WebComponent and bundle for Angular and Vue","links":{"repoUrl":"https://github.com/asyncapi/asyncapi-react"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":"WebComponents","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ui-component"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"DSL":{"description":"Writing YAML by hand is no fun, and maybe you don't want a GUI, so use a Domain Specific Language to write AsyncAPI in your language of choice.","toolsList":[{"title":"BOATS","description":"Compile your single AsyncAPI file from multiple YAML files with BOATS and with the help of the template engine Nunjucks, plus a many extra helpers to automate much of the donkey work.","links":{"repoUrl":"https://github.com/j-d-carmichael/boats"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["dsl"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Frameworks":{"description":"The following is a list of API/application frameworks that make use of AsyncAPI.","toolsList":[{"title":"Asynction","description":"SocketIO server framework driven by the AsyncAPI specification. Asynction guarantees that your API will work in accordance with its AsyncAPI documentation. Built on top of Flask-SocketIO.","links":{"websiteUrl":"https://pypi.org/project/asynction/","repoUrl":"https://github.com/dedoussis/asynction"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"technology":[{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["framework"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"GitHub Actions":{"description":"The following is a list of GitHub Actions that you can use in your workflows","toolsList":[{"title":"API documentation generation on Bump.sh","description":"With this GitHub Action you can automatically generate your API reference (with the changelog and diff) on Bump.sh from any AsyncAPI file.","links":{"websiteUrl":"https://github.com/marketplace/actions/api-documentation-on-bump","repoUrl":"https://github.com/bump-sh/github-action"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI GitHub Action","description":"This action validates if the AsyncAPI schema file is valid or not.","links":{"websiteUrl":"https://github.com/marketplace/actions/asyncapi-github-action","repoUrl":"https://github.com/WaleedAshraf/asyncapi-github-action"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["github-action","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Automated version bump for AsyncAPI documents","description":"With this GitHub Action, you can automatically bump the version based on commit messages, which is similar to what semantic-release is for NPM.","links":{"websiteUrl":"https://github.com/marketplace/actions/automated-version-bump-for-asyncapi","repoUrl":"https://github.com/bump-sh/github-action"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"GitHub Action for Generator","description":null,"links":{"repoUrl":"https://github.com/actions-marketplace-validations/asyncapi_github-action-for-generator"},"filters":{"technology":[{"name":"AsyncAPI Generator","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Mocking and Testing":{"description":"The tools below take specification documents as input, then publish fake messages to broker destinations for simulation purposes. They may also check that publisher messages are compliant with schemas.","toolsList":[{"title":"Microcks","description":"Mocking and testing platform for API and microservices. Turn your AsyncAPI, OpenAPI contract examples, or Postman collections into ready-to-use mocks. Use examples to simulate and validate received messages according to schema elements.","links":{"websiteUrl":"https://microcks.io/","repoUrl":"https://github.com/microcks/microcks"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Kubernetes-native","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Saas","color":"bg-[#6AB8EC]","borderColor":"border-[#2275AD]"}],"categories":["mocking-and-testing"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"MultiAPI Converter","description":"Use AsyncAPI definition, to generate Spring Cloud Contract producer validation or consumer stubs, using maven.","links":{"repoUrl":"https://github.com/sngular/scc-multiapi-converter"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"}],"categories":["mocking-and-testing"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Virtualan","description":"Mocking and testing platform for API and microservices. Allows you to create and setup mocks for OpenAPI and AsyncAPI contracts. Shows how to setup and create AsyncAPI GitHub Reference Examples and OpenAPI GitHub Reference Examples.","links":{"websiteUrl":"https://www.virtualan.io/index.html","repoUrl":"https://github.com/virtualansoftware"},"filters":{"technology":[{"name":"Kubernetes-native","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["mocking-and-testing"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Validators":{"description":"The following is a list of tools that validate AsyncAPI documents.","toolsList":[{"title":"AMF","description":"AMF (AML Modeling Framework) is an open-source library capable of parsing and validating AML metadata documents.","links":{"docsUrl":"https://a.ml/docs/","repoUrl":"https://github.com/aml-org/amf"},"filters":{"language":[{"name":"Scala","color":"bg-[#FFA299]","borderColor":"border-[#DF301F]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI GitHub Action","description":"This action validates if the AsyncAPI schema file is valid or not.","links":{"websiteUrl":"https://github.com/marketplace/actions/asyncapi-github-action","repoUrl":"https://github.com/WaleedAshraf/asyncapi-github-action"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["github-action","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI Parser","description":"Use this package to parse and validate AsyncAPI documents —either YAML or JSON— in your Node.js or browser application. Updated bundle for the browser is always attached to the GitHub Release.","links":{"repoUrl":"https://github.com/asyncapi/parser-js"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"AsyncAPI Parser","description":"The AsyncAPI Parser validates AsyncAPI documents according to dedicated schemas.","links":{"repoUrl":"https://github.com/asyncapi/parser-go"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":true,"technology":[]}},{"title":"AsyncAPI Parser Wrapper","description":"Use this library to parse and validate AsyncAPI documents — either YAML or JSON — in your Java application. It is a Java wrapper over JavaScript Parser implemented using J2V8.","links":{"repoUrl":"https://github.com/AsyncAPITools/parser-java-wrapper"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"asyncapi-validator","description":"It allows you to validate the schema of your messages against your AsyncAPI schema definition. You can use it with Kafka, RabbitMQ or any other messaging/queue.","links":{"repoUrl":"https://github.com/WaleedAshraf/asyncapi-validator"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Spectral","description":"A flexible JSON/YAML linter for creating automated style guides, with baked in support for OpenAPI v3.1, v3.0, and v2.0 as well as AsyncAPI v2.x.","links":{"repoUrl":"https://github.com/stoplightio/spectral"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Compare tools":{"description":"The following is a list of tools that compare AsyncAPI documents.","toolsList":[{"title":"Api-Smart-Diff","description":"It allows you to compare two API documents and classify changes. Supported API specifications: OpenAPI, AsyncAPI, JsonSchema.","links":{"repoUrl":"https://github.com/udamir/api-smart-diff"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"categories":["compare-tool"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI Diff","description":"Diff is a library that compares two AsyncAPI Documents and provides information about the differences by pointing out explicitly information like breaking changes.","links":{"repoUrl":"https://github.com/asyncapi/diff"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["compare-tool"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"jasyncapicmp","description":"Tool/library/maven-plugin for comparing two AsyncAPI versions and evaluating compatibility.","links":{"websiteUrl":"https://siom79.github.io/jasyncapicmp/","repoUrl":"https://github.com/siom79/jasyncapicmp"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["compare-tool"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"CLIs":{"description":"The following is a list of tools that you can work with in terminal or do some CI/CD automation.","toolsList":[{"title":"AsyncAPI CLI","description":"One CLI to rule them all. \nThis is a CLI that aims to integrate all AsyncAPI tools that you need while AsyncAPI document development and maintainance. \nYou can use it to generate docs or code, validate AsyncAPI document and event create new documents.\n","links":{"websiteUrl":"https://www.asyncapi.com/tools/cli","repoUrl":"https://github.com/asyncapi/cli"},"filters":{"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["others","cli"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"AsyncAPI-format","description":"Format an AsyncAPI document by ordering, casing, formatting, and filtering fields.","links":{"repoUrl":"https://github.com/asyncapi/converter-go"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["converter","cli"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Bundlers":{"description":"The following is a list of tools that you can work with to bundle AsyncAPI documents.","toolsList":[{"title":"Api-ref-bundler","description":"It allows you bundle/dereference external/internal $refs in Json based API document. Supported specifications: OpenAPI, AsyncAPI, JsonSchema.","links":{"repoUrl":"https://github.com/udamir/api-ref-bundler"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["bundler"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI Bundler","description":"Combine multiple AsyncAPI specification files into one.","links":{"repoUrl":"https://github.com/asyncapi/bundler"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["bundler"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"IDE Extensions":{"description":"The following is a list of extensions for different IDEs like VSCode, IntelliJ IDEA and others","toolsList":[{"title":"asyncapi-preview","description":"VSCode extension that enables you to:\n - Preview documentation generated using you AsyncAPI document. It uses AsyncAPI React component under the hood,\n - Create AsyncAPI documents faster using SmartPaste functionality\n","links":{"repoUrl":"https://github.com/asyncapi/vs-asyncapi-preview"},"filters":{"technology":[{"name":"VSCode","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"SmartPaste","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ide-extension"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"jAsyncAPI - IDEA plugin","description":"Idea plugin for the java-asyncapi - Helps to edit and validate AsyncAPI schemas.","links":{"websiteUrl":"https://plugins.jetbrains.com/plugin/15673-asyncapi","docsUrl":"https://github.com/asyncapi/jasyncapi-idea-plugin#usage","repoUrl":"https://github.com/asyncapi/jasyncapi-idea-plugin"},"filters":{"language":[{"name":"Kotlin","color":"bg-[#B1ACDF]","borderColor":"border-[#756BD9]"}],"technology":[{"name":"JetBrains","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"IntelliJ IDEA","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ide-extension"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"Others":{"description":"The following is a list of tools that comes under Other category.","toolsList":[{"title":"AsyncAPI CLI","description":"One CLI to rule them all. \nThis is a CLI that aims to integrate all AsyncAPI tools that you need while AsyncAPI document development and maintainance. \nYou can use it to generate docs or code, validate AsyncAPI document and event create new documents.\n","links":{"websiteUrl":"https://www.asyncapi.com/tools/cli","repoUrl":"https://github.com/asyncapi/cli"},"filters":{"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["others","cli"],"hasCommercial":false,"isAsyncAPIOwner":true}}]}} \ No newline at end of file +{"APIs":{"description":"The following is a list of APIs that expose functionality related to AsyncAPI.","toolsList":[{"title":"API Tracker - AsyncAPI specs","description":"Explore APIs and companies with public AsyncAPI specifications.","links":{"websiteUrl":"https://apitracker.io/specifications/asyncapi","repoUrl":""},"filters":{"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI Server API","description":"Server API providing official AsyncAPI tools","links":{"websiteUrl":"https://api.asyncapi.com/v1","docsUrl":"https://api.asyncapi.com/v1/docs","repoUrl":"https://github.com/asyncapi/server-api"},"filters":{"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["api"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"AsyncAPI-Directory by APIs.guru","description":"Directory of asynchronous API specifications in AsyncAPI format.","links":{"websiteUrl":"https://apis.guru/asyncapi-directory/","repoUrl":"https://github.com/APIs-guru/asyncapi-directory"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"SIO-AsyncAPI","description":"This is code-first approach to generate AsyncAPI specification from Socket.IO server.","links":{"websiteUrl":"https://github.com/daler-rahimov/sio-asyncapi","docsUrl":"https://github.com/daler-rahimov/sio-asyncapi","repoUrl":"https://github.com/daler-rahimov/sio-asyncapi"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"technology":[{"name":"Socket.IO","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["code-first","api"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Code-first tools":{"description":"The following is a list of tools that generate AsyncAPI documents from your code.","toolsList":[{"title":"AsyncAPI.Net","description":"The AsyncAPI.NET SDK contains a useful object model for AsyncAPI documents in .NET along with common serializers to extract raw OpenAPI JSON and YAML documents from the model.","links":{"websiteUrl":"https://github.com/LEGO/AsyncAPI.NET/","repoUrl":"https://github.com/LEGO/AsyncAPI.NET"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"}],"categories":["converters","code-first","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"EventBridge Atlas","description":"Tool that translates your AWS EventBridge Schemas into an AsyncAPI document and a web UI.","links":{"websiteUrl":"https://eventbridge-atlas.netlify.app/","repoUrl":"https://github.com/boyney123/eventbridge-atlas"},"filters":{"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Go AsyncAPI","description":"This library helps to create AsyncAPI spec from your Go message structures. It uses reflection to translate Go structures in JSON Schema definitions and arrange them in AsyncAPI schema.","links":{"repoUrl":"https://github.com/swaggest/go-asyncapi"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"Java AsyncAPI","description":"This tool stores modules, which simplifies interacting with AsyncAPI in jvm ecosystem.","links":{"repoUrl":"https://github.com/asyncapi/jasyncapi"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Kotlin","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"KnstEventBus","description":"AsyncApi code-first tools for c#. Generates document and view.","links":{"repoUrl":"https://github.com/d0972058277/KnstEventBus"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"},{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Kotlin AsyncAPI","description":"The Kotlin AsyncAPI project aims to provide convenience tools for generating and serving AsyncAPI documentation. The core of this project is a Kotlin DSL for building the specification in a typesafe way.","links":{"repoUrl":"https://github.com/OpenFolder/kotlin-asyncapi"},"filters":{"language":[{"name":"Kotlin","color":"bg-[#B1ACDF]","borderColor":"border-[#756BD9]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"nestjs-asyncapi","description":"Utilize decorators to generate AsyncAPI document utilizing DTOs (similar to @nestjs/swagger) and a web UI.","links":{"repoUrl":"https://github.com/flamewow/nestjs-asyncapi"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Nest Js","color":"bg-[#E1224E]","borderColor":"border-[#B9012b]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Neuroglia AsyncAPI","description":"A .NET SDK for the Async API specification. Automatically generates and serves AsyncAPI documents based on your code. Includes fluent-builders to create AsyncAPI documents from scratch, and provides a web-based GUI to browse generated documents.","links":{"repoUrl":"https://github.com/neuroglia-io/AsyncApi"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Saunter","description":"Saunter is an AsyncAPI documentation generator for dotnet. Generates (and hosts) an AsyncAPI schema document from your code.","links":{"repoUrl":"https://github.com/tehmantra/saunter"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"SIO-AsyncAPI","description":"This is code-first approach to generate AsyncAPI specification from Socket.IO server.","links":{"websiteUrl":"https://github.com/daler-rahimov/sio-asyncapi","docsUrl":"https://github.com/daler-rahimov/sio-asyncapi","repoUrl":"https://github.com/daler-rahimov/sio-asyncapi"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"technology":[{"name":"Socket.IO","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["code-first","api"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Springwolf","description":"Automated documentation for async APIs built with Spring Boot. Like Springfox for AsyncAPI. Auto-generates an AsyncAPI document and a web UI.","links":{"websiteUrl":"https://springwolf.github.io/","repoUrl":"https://github.com/springwolf/springwolf-core"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"sttp tapir","description":"Library for describing HTTP endpoints, and then interpreting them as a server, client, or documentation","links":{"websiteUrl":"https://tapir.softwaremill.com/","repoUrl":"https://github.com/softwaremill/tapir"},"filters":{"language":[{"name":"Scala","color":"bg-[#FFA299]","borderColor":"border-[#DF301F]"}],"categories":["code-first"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}}]},"Code Generators":{"description":"The following is a list of tools that generate code from an AsyncAPI document; not the other way around.","toolsList":[{"title":"AsyncAPI Generator","description":"Generator is a tool that you can use to generate whatever you want basing on the AsyncAPI specification file as an input.","links":{"docsUrl":"https://www.asyncapi.com/docs/tools/generator","repoUrl":"https://github.com/asyncapi/generator"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["code-generator","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Golang AsyncAPI Code Generator","description":"Generate Go client and server boilerplate from AsyncAPI specifications. Can be called from `go generate` without requirements.\n","links":{"repoUrl":"https://github.com/lerenn/asyncapi-codegen"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"MultiAPI Generator","description":"This is a plugin designed to help developers automatizing the creation of code classes from YML files based on AsyncApi and OpenAPI. It is presented in 2 flavours Maven and Gradle","links":{"repoUrl":"https://github.com/sngular/scs-multiapi-plugin"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Groovy","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Node-RED AsyncAPI plugin","description":"A plugin for generating and configuring nodes for Kafka, MQTT, AMQP, etc. automatically from an AsyncAPI specification.","links":{"repoUrl":"https://github.com/dalelane/node-red-contrib-plugin-asyncapi"},"filters":{"technology":[{"name":"Node-RED","color":"bg-[#FF7474]","borderColor":"border-[#8F0101]"}],"categories":["code-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Converters":{"description":"The following is a list of tools that do not yet belong to any specific category but are also useful for the community.","toolsList":[{"title":"AsyncAPI-format","description":"Format an AsyncAPI document by ordering, casing, formatting, and filtering fields.","links":{"repoUrl":"https://github.com/thim81/asyncapi-format"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["converter","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI.Net","description":"The AsyncAPI.NET SDK contains a useful object model for AsyncAPI documents in .NET along with common serializers to extract raw OpenAPI JSON and YAML documents from the model.","links":{"websiteUrl":"https://github.com/LEGO/AsyncAPI.NET/","repoUrl":"https://github.com/LEGO/AsyncAPI.NET"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"}],"categories":["converters","code-first","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Converter","description":"Converts old versions of AsyncAPI files into the latest version.","links":{"repoUrl":"https://github.com/asyncapi/converter-js"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["converter"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"Converter-Go","description":"The AsyncAPI Converter converts AsyncAPI documents from versions 1.0.0, 1.1.0 and 1.2.0 to version 2.0.0. It supports both json and yaml formats on input and output. By default, the AsyncAPI Converter converts a document into the json format.","links":{"repoUrl":"https://github.com/asyncapi/converter-go"},"filters":{"language":[{"name":"Go/Golang","color":"bg-[#8ECFDF]","borderColor":"border-[#00AFD9]"}],"categories":["converter"],"hasCommercial":false,"isAsyncAPIOwner":true,"technology":[]}}]},"Directories":{"description":"The following is a list of directories that index public AsyncAPI documents.","toolsList":[{"title":"API Tracker - AsyncAPI specs","description":"Explore APIs and companies with public AsyncAPI specifications.","links":{"websiteUrl":"https://apitracker.io/specifications/asyncapi","repoUrl":""},"filters":{"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI-Directory by APIs.guru","description":"Directory of asynchronous API specifications in AsyncAPI format.","links":{"websiteUrl":"https://apis.guru/asyncapi-directory/","repoUrl":"https://github.com/APIs-guru/asyncapi-directory"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["api","directory"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Documentation Generators":{"description":"The following is a list of tools that generate human-readable documentation from an AsyncAPI document.","toolsList":[{"title":"AsyncAPI Generator","description":"Generator is a tool that you can use to generate whatever you want basing on the AsyncAPI specification file as an input.","links":{"docsUrl":"https://www.asyncapi.com/docs/tools/generator","repoUrl":"https://github.com/asyncapi/generator"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Markdown","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"asyncapi-asciidoc-template","description":"Asciidoc template for the asyncapi generator","links":{"repoUrl":"https://gitlab.com/djencks/asyncapi-asciidoc-template"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"}],"categories":["documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Bump.sh","description":"OpenAPI 2 & 3 / AsyncAPI 2 documentation generator, with automatic changelog and visual diff.","links":{"websiteUrl":"https://bump.sh/","repoUrl":""},"filters":{"categories":["documentation-generator"],"hasCommercial":true,"isAsyncAPIOwner":false,"technology":[]}},{"title":"Cupid","description":"A library that focuses on finding and analyzing the relationships between AsyncAPI documents. It outputs a map of the system architecture.","links":{"repoUrl":"https://github.com/asyncapi/cupid"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"KnstEventBus","description":"AsyncApi code-first tools for c#. Generates document and view.","links":{"repoUrl":"https://github.com/d0972058277/KnstEventBus"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"},{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Springwolf","description":"Automated documentation for async APIs built with Spring Boot. Like Springfox for AsyncAPI. Auto-generates an AsyncAPI document and a web UI.","links":{"websiteUrl":"https://springwolf.github.io/","repoUrl":"https://github.com/springwolf/springwolf-core"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"}],"categories":["code-first","documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Widdershins","description":"OpenAPI 3.0 / Swagger 2.0 / AsyncAPI 1.0 definition to Slate / Shins compatible markdown.","links":{"websiteUrl":"https://mermade.github.io/reslate/","repoUrl":"https://github.com/Mermade/widdershins"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"},{"name":"Shell","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["documentation-generator"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Editors":{"description":"The following is a list of editors or related tools that allow editing of AsyncAPI document.","toolsList":[{"title":"AsyncAPI Studio","description":"Visually design your AsyncAPI files and event-driven architecture.","links":{"websiteUrl":"https://studio.asyncapi.com","repoUrl":"https://github.com/asyncapi/studio"},"filters":{"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["editor"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"UI components":{"description":"The following is a list of UI components to view AsyncAPI documents.","toolsList":[{"title":"Api-Diff-Viewer","description":"React component to view the difference between two Json based API documents. Supported specifications: JsonSchema, OpenAPI 3.x, AsyncAPI 2.x.","links":{"repoUrl":"https://github.com/udamir/api-diff-viewer","websiteUrl":"https://api-diff-viewer.vercel.app/"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":"Babel","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Storybook","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ui-component"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI React component","description":"React component for rendering documentation from your specification in real-time in the browser. It also provides a WebComponent and bundle for Angular and Vue","links":{"repoUrl":"https://github.com/asyncapi/asyncapi-react"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"React JS","color":"bg-[#9FECFA]","borderColor":"border-[#08D8FE]"},{"name":"WebComponents","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ui-component"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"DSL":{"description":"Writing YAML by hand is no fun, and maybe you don't want a GUI, so use a Domain Specific Language to write AsyncAPI in your language of choice.","toolsList":[{"title":"BOATS","description":"Compile your single AsyncAPI file from multiple YAML files with BOATS and with the help of the template engine Nunjucks, plus a many extra helpers to automate much of the donkey work.","links":{"repoUrl":"https://github.com/j-d-carmichael/boats"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["dsl"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Frameworks":{"description":"The following is a list of API/application frameworks that make use of AsyncAPI.","toolsList":[{"title":"Asynction","description":"SocketIO server framework driven by the AsyncAPI specification. Asynction guarantees that your API will work in accordance with its AsyncAPI documentation. Built on top of Flask-SocketIO.","links":{"websiteUrl":"https://pypi.org/project/asynction/","repoUrl":"https://github.com/dedoussis/asynction"},"filters":{"language":[{"name":"Python","color":"bg-[#A8D0EF]","borderColor":"border-[#3878AB]"}],"technology":[{"name":"Flask","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"}],"categories":["framework"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"GitHub Actions":{"description":"The following is a list of GitHub Actions that you can use in your workflows","toolsList":[{"title":"API documentation generation on Bump.sh","description":"With this GitHub Action you can automatically generate your API reference (with the changelog and diff) on Bump.sh from any AsyncAPI file.","links":{"websiteUrl":"https://github.com/marketplace/actions/api-documentation-on-bump","repoUrl":"https://github.com/bump-sh/github-action"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI GitHub Action","description":"This action validates if the AsyncAPI schema file is valid or not.","links":{"websiteUrl":"https://github.com/marketplace/actions/asyncapi-github-action","repoUrl":"https://github.com/WaleedAshraf/asyncapi-github-action"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["github-action","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Automated version bump for AsyncAPI documents","description":"With this GitHub Action, you can automatically bump the version based on commit messages, which is similar to what semantic-release is for NPM.","links":{"websiteUrl":"https://github.com/marketplace/actions/automated-version-bump-for-asyncapi","repoUrl":"https://github.com/bump-sh/github-action"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"GitHub Action for Generator","description":"GitHub Action to generate all the things from your AsyncAPI document using the AsyncAPI generator","links":{"repoUrl":"https://github.com/asyncapi/github-action-for-generator"},"filters":{"technology":[{"name":"AsyncAPI Generator","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"GitHub Action for Generator","description":null,"links":{"repoUrl":"https://github.com/actions-marketplace-validations/asyncapi_github-action-for-generator"},"filters":{"technology":[{"name":"AsyncAPI Generator","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["github-action"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Mocking and Testing":{"description":"The tools below take specification documents as input, then publish fake messages to broker destinations for simulation purposes. They may also check that publisher messages are compliant with schemas.","toolsList":[{"title":"Microcks","description":"Mocking and testing platform for API and microservices. Turn your AsyncAPI, OpenAPI contract examples, or Postman collections into ready-to-use mocks. Use examples to simulate and validate received messages according to schema elements.","links":{"websiteUrl":"https://microcks.io/","repoUrl":"https://github.com/microcks/microcks"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Kubernetes-native","color":"bg-[#D7C7F2]","borderColor":"border-[#A387D2]"},{"name":"Saas","color":"bg-[#6AB8EC]","borderColor":"border-[#2275AD]"}],"categories":["mocking-and-testing"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"MultiAPI Converter","description":"Use AsyncAPI definition, to generate Spring Cloud Contract producer validation or consumer stubs, using maven.","links":{"repoUrl":"https://github.com/sngular/scc-multiapi-converter"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Springboot","color":"bg-[#98E279]","borderColor":"border-[#68BC44]"}],"categories":["mocking-and-testing"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"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.in","docsUrl":"https://specmatic.in/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-validator","description":"It allows you to validate the schema of your messages against your AsyncAPI schema definition. You can use it with Kafka, RabbitMQ or any other messaging/queue.","links":{"repoUrl":"https://github.com/WaleedAshraf/asyncapi-validator"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI.Net","description":"The AsyncAPI.NET SDK contains a useful object model for AsyncAPI documents in .NET along with common serializers to extract raw OpenAPI JSON and YAML documents from the model.","links":{"websiteUrl":"https://github.com/LEGO/AsyncAPI.NET/","repoUrl":"https://github.com/LEGO/AsyncAPI.NET"},"filters":{"language":[{"name":"C#","color":"bg-[#E3AFE0]","borderColor":"border-[#9B4F96]"}],"technology":[{"name":".NET","color":"bg-[#A184FF]","borderColor":"border-[#5026D4]"},{"name":"ASP.NET","color":"bg-[#71C2FB]","borderColor":"border-[#1577BC]"}],"categories":["converters","code-first","validator"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"Spectral","description":"A flexible JSON/YAML linter for creating automated style guides, with baked in support for OpenAPI v3.1, v3.0, and v2.0 as well as AsyncAPI v2.x.","links":{"repoUrl":"https://github.com/stoplightio/spectral"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["validator"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Compare tools":{"description":"The following is a list of tools that compare AsyncAPI documents.","toolsList":[{"title":"Api-Smart-Diff","description":"It allows you to compare two API documents and classify changes. Supported API specifications: OpenAPI, AsyncAPI, JsonSchema.","links":{"repoUrl":"https://github.com/udamir/api-smart-diff"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"categories":["compare-tool"],"hasCommercial":false,"isAsyncAPIOwner":false,"technology":[]}},{"title":"AsyncAPI Diff","description":"Diff is a library that compares two AsyncAPI Documents and provides information about the differences by pointing out explicitly information like breaking changes.","links":{"repoUrl":"https://github.com/asyncapi/diff"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["compare-tool"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"jasyncapicmp","description":"Tool/library/maven-plugin for comparing two AsyncAPI versions and evaluating compatibility.","links":{"websiteUrl":"https://siom79.github.io/jasyncapicmp/","repoUrl":"https://github.com/siom79/jasyncapicmp"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"}],"categories":["compare-tool"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"CLIs":{"description":"The following is a list of tools that you can work with in terminal or do some CI/CD automation.","toolsList":[{"title":"AsyncAPI CLI","description":"One CLI to rule them all. \nThis is a CLI that aims to integrate all AsyncAPI tools that you need while AsyncAPI document development and maintainance. \nYou can use it to generate docs or code, validate AsyncAPI document and event create new documents.\n","links":{"websiteUrl":"https://www.asyncapi.com/tools/cli","repoUrl":"https://github.com/asyncapi/cli"},"filters":{"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["others","cli"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"AsyncAPI-format","description":"Format an AsyncAPI document by ordering, casing, formatting, and filtering fields.","links":{"repoUrl":"https://github.com/asyncapi/converter-go"},"filters":{"language":[{"name":"JavaScript","color":"bg-[#F2F1C7]","borderColor":"border-[#BFBE86]"}],"technology":[{"name":"Node.js","color":"bg-[#BDFF67]","borderColor":"border-[#84CE24]"}],"categories":["converter","cli"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"ZenWave SDK","description":"DDD and API-First for Event-Driven Microservices","links":{"websiteUrl":"https://zenwave360.github.io/","docsUrl":"https://zenwave360.github.io/zenwave-sdk/plugins/asyncapi-spring-cloud-streams3/","repoUrl":"https://github.com/zenwave360/zenwave-sdk"},"filters":{"language":[{"name":"Java","color":"bg-[#ECA2A4]","borderColor":"border-[#EC2125]"}],"technology":[{"name":"Maven","color":"bg-[#FF6B80]","borderColor":"border-[#CA1A33]"},{"name":"Liquid","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"Spring Cloud Streams","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"JHipster JDL","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["code-generator","dsl","mocking-and-testing","cli"],"hasCommercial":false,"isAsyncAPIOwner":false}}]},"Bundlers":{"description":"The following is a list of tools that you can work with to bundle AsyncAPI documents.","toolsList":[{"title":"Api-ref-bundler","description":"It allows you bundle/dereference external/internal $refs in Json based API document. Supported specifications: OpenAPI, AsyncAPI, JsonSchema.","links":{"repoUrl":"https://github.com/udamir/api-ref-bundler"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["bundler"],"hasCommercial":false,"isAsyncAPIOwner":false}},{"title":"AsyncAPI Bundler","description":"Combine multiple AsyncAPI specification files into one.","links":{"repoUrl":"https://github.com/asyncapi/bundler"},"filters":{"language":[{"name":"TypeScript","color":"bg-[#7DBCFE]","borderColor":"border-[#2C78C7]"}],"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["bundler"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"IDE Extensions":{"description":"The following is a list of extensions for different IDEs like VSCode, IntelliJ IDEA and others","toolsList":[{"title":"asyncapi-preview","description":"VSCode extension that enables you to:\n - Preview documentation generated using you AsyncAPI document. It uses AsyncAPI React component under the hood,\n - Create AsyncAPI documents faster using SmartPaste functionality\n","links":{"repoUrl":"https://github.com/asyncapi/vs-asyncapi-preview"},"filters":{"technology":[{"name":"VSCode","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"SmartPaste","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ide-extension"],"hasCommercial":false,"isAsyncAPIOwner":true}},{"title":"jAsyncAPI - IDEA plugin","description":"Idea plugin for the java-asyncapi - Helps to edit and validate AsyncAPI schemas.","links":{"websiteUrl":"https://plugins.jetbrains.com/plugin/15673-asyncapi","docsUrl":"https://github.com/asyncapi/jasyncapi-idea-plugin#usage","repoUrl":"https://github.com/asyncapi/jasyncapi-idea-plugin"},"filters":{"language":[{"name":"Kotlin","color":"bg-[#B1ACDF]","borderColor":"border-[#756BD9]"}],"technology":[{"name":"JetBrains","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"},{"name":"IntelliJ IDEA","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["ide-extension"],"hasCommercial":false,"isAsyncAPIOwner":true}}]},"Others":{"description":"The following is a list of tools that comes under Other category.","toolsList":[{"title":"AsyncAPI CLI","description":"One CLI to rule them all. \nThis is a CLI that aims to integrate all AsyncAPI tools that you need while AsyncAPI document development and maintainance. \nYou can use it to generate docs or code, validate AsyncAPI document and event create new documents.\n","links":{"websiteUrl":"https://www.asyncapi.com/tools/cli","repoUrl":"https://github.com/asyncapi/cli"},"filters":{"technology":[{"name":"TypeScript","color":"bg-[#61d0f2]","borderColor":"border-[#40ccf7]"}],"categories":["others","cli"],"hasCommercial":false,"isAsyncAPIOwner":true}}]}} \ No newline at end of file diff --git a/cypress/fixtures/eventsData.json b/cypress/fixtures/eventsData.json new file mode 100644 index 00000000000..a4e77f7e62e --- /dev/null +++ b/cypress/fixtures/eventsData.json @@ -0,0 +1,239 @@ +[ + { + "title": "Spec 3.0 Meeting", + "calLink": "https://www.google.com/calendar/event?eid=djhsdjZvbmRsampvb2tsYzhkZWFyc3FtYTAgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/649", + "date": "2023-04-13T15:00:00.000Z" + }, + { + "title": "Community Meeting", + "calLink": "https://www.google.com/calendar/event?eid=MzgwdmZiMTc4cnBmbTUzdWVlbmM4aWYyM2MgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/659", + "banner": "https://user-images.githubusercontent.com/40604284/229763606-c0b6ed3b-e120-427c-b87d-357856d92777.png", + "date": "2023-04-18T16:00:00.000Z" + }, + { + "title": "Adding support for non-JSON schemas", + "calLink": "https://www.google.com/calendar/event?eid=dTlrM2s3Nmpqcjk2bWszYW83NmJzNnN0cm8gY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/668", + "banner": "", + "date": "2023-04-18T14:00:00.000Z" + }, + { + "title": "Spec 3.0 Meeting", + "calLink": "https://www.google.com/calendar/event?eid=Z2l0am1xbTBhcm8xa2sxc2dyOGdoaXRmZTQgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/670", + "banner": "", + "date": "2023-04-26T15:00:00.000Z" + }, + { + "title": "Tackling interoperability challenges in open-source", + "calLink": "https://www.google.com/calendar/event?eid=M2Njb2dib2VvMXF1dmR1bGJ0ZG1tb2txMWsgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/681", + "banner": "https://user-images.githubusercontent.com/66913810/233324999-bce12c6f-6e8e-4aca-acf5-053cfa22378a.png", + "date": "2023-04-26T09:00:00.000Z" + }, + { + "title": "Community Meeting", + "calLink": "https://www.google.com/calendar/event?eid=YjcwZ2ZmOXNmMmU1YmRybXB0azk1Y2prb3MgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/688", + "banner": "https://user-images.githubusercontent.com/40604284/233369404-38892fbe-7082-4492-8aed-0a97ee8df011.png", + "date": "2023-05-02T08:00:00.000Z" + }, + { + "title": "AsyncAPI x Google Season of Doc's 2023", + "calLink": "https://www.google.com/calendar/event?eid=Yzdyb2F1c3RjOXVvcTh2NXFiZGpyNjgzN3MgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/692", + "banner": "https://user-images.githubusercontent.com/66913810/234268392-10a4c02d-60e6-46ec-abcc-74c5aa6088dd.png", + "date": "2023-05-09T16:00:00.000Z" + }, + { + "title": "Community Health in Open-source", + "calLink": "https://www.google.com/calendar/event?eid=ZTNtYXFuN2d2bzZsMzBuOHYyc2kxY2ltb2sgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/698", + "banner": "https://user-images.githubusercontent.com/66913810/234862423-48c98c43-ab13-476c-a232-955e8dfdd3cc.png", + "date": "2023-05-17T16:00:00.000Z" + }, + { + "title": "Spec 3.0 Meeting", + "calLink": "https://www.google.com/calendar/event?eid=ZGZhNjR2bXJ2Zzg1aW4zZ3ZpYWpuZTY3ZTggY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/699", + "banner": "", + "date": "2023-05-10T16:00:00.000Z" + }, + { + "title": "Community Meeting", + "calLink": "https://www.google.com/calendar/event?eid=Nm9qbjFoNGJ1dmppaGM5bTFmdnZzZDFxNzAgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/705", + "banner": "https://user-images.githubusercontent.com/40604284/238269236-93dda2ae-732c-4aab-b71e-18d077b987e7.png", + "date": "2023-05-16T16:00:00.000Z" + }, + { + "title": "Spec 3.0 Meeting", + "calLink": "https://www.google.com/calendar/event?eid=a3JnNnJibDAzNW9ja3ZnMXZ0OGJtcjBqMWMgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/714", + "banner": "", + "date": "2023-05-24T16:00:00.000Z" + }, + { + "title": "Community Meeting", + "calLink": "https://www.google.com/calendar/event?eid=NG5pMWJpajA2ODhjczhiY2doNjRudnVybzQgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/715", + "banner": "https://user-images.githubusercontent.com/40604284/240259939-641b0476-1a80-41fa-9d3c-0701ad1dfff0.png", + "date": "2023-05-30T08:00:00.000Z" + }, + { + "title": "Headless Commerce: Streamlining Architecture", + "calLink": "https://www.google.com/calendar/event?eid=ODE1aHU2YzByNXJ0MjNlNGNjYmZwbm03b28gY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/716", + "banner": "https://user-images.githubusercontent.com/40604284/240259984-a4ce1ebd-653a-4a61-818f-6707b33b0777.png", + "date": "2023-06-08T12:00:00.000Z" + }, + { + "title": "Studio plans", + "calLink": "https://www.google.com/calendar/event?eid=M3NudjU3MG1obmh1MGJxaXBvY2F0dDU4ZTQgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/728", + "banner": "", + "date": "2023-06-05T10:00:00.000Z" + }, + { + "title": "Spec 3.0 Meeting", + "calLink": "https://www.google.com/calendar/event?eid=NnIxNnRnMmVoaXMxcGRvYnI1dTM4YXZocmMgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/734", + "banner": "", + "date": "2023-06-07T16:00:00.000Z" + }, + { + "title": "Spec 3.0 Meeting", + "calLink": "https://www.google.com/calendar/event?eid=bXJoZ24wcG5jbzM3dTR2cGxuYnQxbHA0Y3MgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/737", + "banner": "", + "date": "2023-06-21T16:00:00.000Z" + }, + { + "title": "Community Meeting", + "calLink": "https://www.google.com/calendar/event?eid=bmZkbWxjNnZlb2tvYzRidWVsZTgyczR1MTQgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/738", + "banner": "https://user-images.githubusercontent.com/40604284/244367862-a1120d1c-4e71-4a8f-b291-857344f15a5f.png", + "date": "2023-06-13T16:00:00.000Z" + }, + { + "title": "Let's talk about contributing Mentorship Program FAQ", + "calLink": "https://www.google.com/calendar/event?eid=N25kZjVhYjNyZ2oyZG5lam05bTJyMWR1NmsgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/739", + "banner": "https://user-images.githubusercontent.com/40604284/244369872-dc5b89e4-526f-4605-a09a-835e0bf93797.png", + "date": "2023-06-14T13:00:00.000Z" + }, + { + "title": "Studio plans", + "calLink": "https://www.google.com/calendar/event?eid=Ym4ybG5nNnJrN2NjcnRjdXZ1MGIxMTlydm8gY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/744", + "banner": "", + "date": "2023-06-05T10:00:00.000Z" + }, + { + "title": "Studio planning", + "calLink": "https://www.google.com/calendar/event?eid=aGNmNDl0c2pzZGxoam5iNXBnY3RyczE5OTggY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/745", + "banner": "", + "date": "2023-06-15T10:00:00.000Z" + }, + { + "title": "Spec 3.0 Docs Meeting", + "calLink": "https://www.google.com/calendar/event?eid=dGs5N205MHNrcHAzODN0bDI2b3RpdjY5djggY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/747", + "banner": "", + "date": "2023-06-15T02:30:00.000Z" + }, + { + "title": "Spec 3.0 Docs Meeting", + "calLink": "https://www.google.com/calendar/event?eid=ajJoMTY5N2hpOWFlMTcyamFmbWttbTJlNG8gY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/749", + "banner": "", + "date": "2023-06-22T14:30:00.000Z" + }, + { + "title": "Spec 3.0 Meeting", + "calLink": "https://www.google.com/calendar/event?eid=MHBhZDRzZ2M0OXFqbDJhaXRxcnUwNm9hcmMgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/760", + "banner": "", + "date": "2023-07-05T16:00:00.000Z" + }, + { + "title": "Spec 3.0 Meeting", + "calLink": "https://www.google.com/calendar/event?eid=aGdqYmk0NDdiMGE4cGo4NzFuaWxycjNiYmsgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/761", + "banner": "", + "date": "2023-07-19T16:00:00.000Z" + }, + { + "title": "Community Meeting", + "calLink": "https://www.google.com/calendar/event?eid=bjZxY3JoZmZjNmk0azU4bDdzOHFrOGcxY28gY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/762", + "banner": "https://user-images.githubusercontent.com/40604284/246774505-ba6d0600-d250-43fe-b6f3-5587de26ea01.png", + "date": "2023-06-27T08:00:00.000Z" + }, + { + "title": "Fran AMA AsyncAPI", + "calLink": "https://www.google.com/calendar/event?eid=N2cxZjlobW0xOW9ocG5rMnVhaDZhbDQ2aGcgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/764", + "banner": "", + "date": "2023-06-23T10:00:00.000Z" + }, + { + "title": "Spec 3.0 Docs Meeting", + "calLink": "https://www.google.com/calendar/event?eid=YmhiaTQxNDBicDA0NjgyZmk3M3ZocTJxbGcgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/774", + "banner": "", + "date": "2023-07-06T14:30:00.000Z" + }, + { + "title": "Open Standards and Private Products: A DevRel's Dream or Nightmare", + "calLink": "https://www.google.com/calendar/event?eid=dHMzZ3Q0b2h2NDRuaTVrMTQ3cmsxYzk2bzAgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/775", + "banner": "https://user-images.githubusercontent.com/66913810/249772860-0b6c73a5-a740-4fac-a22d-2d95f823ae07.png", + "date": "2023-07-13T09:00:00.000Z" + }, + { + "title": "Community Meeting", + "calLink": "https://www.google.com/calendar/event?eid=cmFudjRxMjVhazk1Y2FjbXA3Zm1pMWZyZjAgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/784", + "banner": "https://user-images.githubusercontent.com/40604284/250981834-3418496b-d123-4e74-a7ff-082b4714c841.png", + "date": "2023-07-11T16:00:00.000Z" + }, + { + "title": "Spec 3.0 Docs Meeting", + "calLink": "https://www.google.com/calendar/event?eid=NzU0aGMxOWY5MmYyYzA3OTduazF0MWZqY2MgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/790", + "banner": "", + "date": "2023-07-20T14:30:00.000Z" + }, + { + "title": "Spec 3.0 Docs Meeting", + "calLink": "https://www.google.com/calendar/event?eid=aWhzNWwxZWkxdWVlMWhvbGs4aWY2YzU1am8gY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/791", + "banner": "", + "date": "2023-08-03T14:30:00.000Z" + }, + { + "title": "Spec 3.0 Docs Meeting", + "calLink": "https://www.google.com/calendar/event?eid=cG9iOHNqZGlrbmg4cnUxanMzMTgyN3AxdnMgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/792", + "banner": "", + "date": "2023-08-17T14:30:00.000Z" + }, + { + "title": "Community Meeting", + "calLink": "https://www.google.com/calendar/event?eid=MmpwYXMxYjBscjlnYWhtMHR2MnQ2MTMwM2cgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/798", + "banner": "https://user-images.githubusercontent.com/40604284/252807786-f93110e3-c344-4080-9c4f-9d32cb324680.png", + "date": "2023-07-25T08:00:00.000Z" + }, + { + "title": "Design meeting", + "calLink": "https://www.google.com/calendar/event?eid=czVxbG5jZXV2MThxczJjczdhMmtxZzE1djAgY19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bn", + "url": "https://github.com/asyncapi/community/issues/800", + "banner": "", + "date": "2023-07-18T08:00:00.000Z" + } + ] \ No newline at end of file diff --git a/cypress/test/community/Card.cy.js b/cypress/test/community/Card.cy.js index eaea9262428..0fe3fc83d8d 100644 --- a/cypress/test/community/Card.cy.js +++ b/cypress/test/community/Card.cy.js @@ -25,6 +25,7 @@ describe('SmallHomeCards', () => { cy.get('[data-testid="Card-desc"]').contains('Description').should('exist'); cy.get('[data-testid="Card-heading"]').should('have.class','mt-3'); cy.get('[data-testid="Card-desc"]').should('have.class','mt-2'); + cy.get('[href="/path"]').should('exist'); }); it('renders large card correctly', () => { @@ -46,6 +47,7 @@ describe('SmallHomeCards', () => { // Testing for large prop classes and styles cy.get('[data-testid="Card-heading-lg"]').contains('Heading').should('exist'); cy.get('[data-testid="Card-desc-lg"]').contains('Description').should('exist'); + cy.get('[href="/path"]').should('exist'); cy.get('[data-testid="Card-heading-lg"]').should('have.class','mt-10'); cy.get('[data-testid="Card-desc-lg"]').should('have.class','mt-6'); diff --git a/cypress/test/dashboard/GoodFirstIssuesTip.cy.js b/cypress/test/dashboard/GoodFirstIssuesTip.cy.js index 67f7f7b8862..5cca9d74e7a 100644 --- a/cypress/test/dashboard/GoodFirstIssuesTip.cy.js +++ b/cypress/test/dashboard/GoodFirstIssuesTip.cy.js @@ -8,14 +8,12 @@ describe('GoodFirstIssuesTip', () => { }); it('toggles the tip when hovering over the icon', () => { - cy.get('[data-testid="GoodFirstIssuesTip-hover-icon"]').trigger('mouseenter'); - cy.get('[data-testid="GoodFirstIssuesTip-hover-icon"]').trigger('mouseleave'); - + cy.get('[data-testid="GoodFirstIssuesTip-hover-icon"]').click({ force: true }); }); it('renders the tip content with the correct text', () => { - cy.get('[data-testid="GoodFirstIssuesTip-hover-icon"]').trigger('mouseenter'); - //checking for the available class here + cy.get('[data-testid="GoodFirstIssuesTip-hover-icon"]').click({ force: true }); + //checking for the available class here cy.get('.bg-white').should('have.css', 'visibility', 'visible'); cy.contains('Is this your first contribution?').should('exist'); diff --git a/cypress/test/dashboard/Header.cy.js b/cypress/test/dashboard/Header.cy.js index 6de218040db..9bccdae248e 100644 --- a/cypress/test/dashboard/Header.cy.js +++ b/cypress/test/dashboard/Header.cy.js @@ -22,10 +22,11 @@ describe('Header', () => { 'contain', 'Visualize our progress. Get involved.' ); - cy.get('[data-testid="Github-button"]').should('exist'); - cy.get('[data-testid="Slack-button"]').should('exist'); + cy.contains('Contribution Guide') .should('have.attr', 'href', 'https://github.com/asyncapi?type=source#-contribute-to-asyncapi') .should('have.attr', 'target', '_blank'); + cy.get('[data-testid="Button-link"]').should('exist'); + cy.get('[data-testid="Button-link"]').should('exist'); }); }); diff --git a/cypress/test/editor/CodeBlock.cy.js b/cypress/test/editor/CodeBlock.cy.js new file mode 100644 index 00000000000..825960baead --- /dev/null +++ b/cypress/test/editor/CodeBlock.cy.js @@ -0,0 +1,30 @@ +import { mount } from 'cypress/react' +import CodeBlock from '../../../components/editor/CodeBlock' + +describe('CodeBlock component', () => { + beforeEach(() => { + mount( + + { `const message = 'Hello, World!';\nconsole.log(message);` } + + ) + }); + + it('should render correctly', () => { + cy.get('.bg-code-editor-dark').should('exist') + + }) + it('should copy code to clipboard when clicking the copy button', () => { + const copiedText = "const message = 'Hello, World!';\r\nconsole.log(message);" + + cy.get('[data-test="copy-button"]').click({force:true}) + cy.get('[data-testid="clicked-text"]').should('exist'); + + cy.window().then((win) => { + cy.document().then((doc) => { + cy.wrap(win.navigator.clipboard.readText()).should('eq', copiedText) + }) + }) + }) + +}) diff --git a/cypress/test/mockData/mockData.json b/cypress/test/mockData/mockData.json new file mode 100644 index 00000000000..139b01fde36 --- /dev/null +++ b/cypress/test/mockData/mockData.json @@ -0,0 +1,18 @@ +{ + "items": [ + { + "summary": "Event 1", + "start": { + "dateTime": "2023-07-23T10:00:00Z" + }, + "htmlLink": "https://www.example.com/event1" + }, + { + "summary": "Event 2", + "start": { + "dateTime": "2023-07-24T15:30:00Z" + }, + "htmlLink": "https://www.example.com/event2" + } + ] +} \ No newline at end of file diff --git a/cypress/test/pages/community/ambassadors/index.cy.js b/cypress/test/pages/community/ambassadors/index.cy.js new file mode 100644 index 00000000000..f4818f13851 --- /dev/null +++ b/cypress/test/pages/community/ambassadors/index.cy.js @@ -0,0 +1,78 @@ +import MockApp from "../../../../utils/MockApp" +import Index from '../../../../../pages/community/ambassadors/index' +import ambassadorList from '../../../../../config/ambassador_lists.json' +import ambassadors from '../../../../../config/AMBASSADORS_MEMBERS.json' +import { addAdditionalUserInfo } from "../../../../../pages/community/ambassadors/index"; +import { sortBy } from 'lodash'; + +describe('Test for Ambassadors', () => { + beforeEach(() => { + cy.mount() + }); + + it('displays the main Ambassadors section ', () => { + cy.get('[data-testid="Ambassadors-main"]').should('exist') + cy.get('[data-testid="Ambassadors-content"]').should('exist') + cy.get('[data-testid="Ambassadors-button"]').should('exist') + cy.get(`[href="https://github.com/asyncapi/community/blob/master/AMBASSADOR_ORGANIZATION.md#are-you-interested-in-becoming-an-official-asyncapi-ambassador"]`).should('exist'); + cy.get('[data-testid="Ambassadors-Iframe"]').should('exist') + cy.get('[data-testid="Ambassadors-contributions"]').should('exist') + }); + + it('renders the ambassador list with correct data', () => { + ambassadorList.contents.forEach((link) => { + cy.get('[data-testid="Ambassadors-list"]') + .find(`img[alt="${link.title}"]`) + .should('exist') + .and('have.attr', 'src', link.icon); + + cy.get('[data-testid="Ambassadors-list"]') + .contains('h2', link.title) + .should('exist'); + + cy.get('[data-testid="Ambassadors-list"]') + .contains('p', link.details) + .should('exist'); + }); + }); + + it('renders the ambassadors with correct data', () => { + const asyncapiAmbassadors = sortBy( + ambassadors.map((user) => addAdditionalUserInfo(user)), + ['name'] + ); + cy.get('[data-testid="Ambassadors-members-main"]') + .children() + .should('have.length', asyncapiAmbassadors.length); + + asyncapiAmbassadors.forEach((ambassador) => { + cy.get('[data-testid="Ambassadors-members-details"]') + .contains('div', ambassador.name) + + cy.get('[data-testid="Ambassadors-members-img"]') + .find(`img[alt="${ambassador.name}"]`) + .should('have.attr', 'src', ambassador.img); + + cy.get('[data-testid="Ambassadors-members"]') + .contains('div', ambassador.title); + }); + }); + + it('displays the Tokens of our appreciation section with correct data', () => { + cy.get('[data-testid="Events-token"]').should('exist') + + ambassadorList.tokens.forEach((token) => { + cy.contains('.mt-20 li', token.emoji).should('exist'); + cy.contains('.mt-20 li', token.title).should('exist'); + cy.contains('.mt-20 li', token.details).should('exist'); + }); + }); + + it('displays the Become an AsyncAPI Ambassador section with correct data', () => { + cy.get('[data-testid="Events-ambassadors"]').should('exist'); + }); + + it('should display NewsletterSubscribe', () => { + cy.get('[data-testid="NewsletterSubscribe-main"]').should('exist'); + }); +}); \ No newline at end of file diff --git a/cypress/test/pages/community/dashboard.cy.js b/cypress/test/pages/community/dashboard.cy.js new file mode 100644 index 00000000000..da33c1cc006 --- /dev/null +++ b/cypress/test/pages/community/dashboard.cy.js @@ -0,0 +1,28 @@ +import MockApp from "../../../utils/MockApp"; +import DashboardHome from "../../../../pages/community/dashboard"; +import Header from "../../../../components/dashboard/Header"; +import { mount } from '@cypress/react' +describe('Integration Test for Dashboard ', () => { + + it('should filter GoodFirstIssues and check dashboard render ', () => { + mount( + + + + ); + // Click on the first filter option + cy.get(Header).should('exist') + cy.contains('AsyncAPI - Dashboard') + cy.get('[data-testid="Filters-img-container"]').click({ force: true }); + cy.get('[data-testid="Filter-menu"]').within(() => { + cy.get('[data-testid="Select-form"]').eq(0).select('asyncapi/generator', { force: true }); + cy.get('[data-testid="Select-form"]').eq(1).select('docs') + }); + //check if selected is only displayed + cy.contains('asyncapi/generator'); + cy.contains('docs') + //check if this is not selected options are not displayed + cy.should('not.contain', 'asyncapi/community'); + cy.should('not.contain', 'javascript'); + }); +}); \ No newline at end of file diff --git a/cypress/test/pages/community/events/index.cy.js b/cypress/test/pages/community/events/index.cy.js new file mode 100644 index 00000000000..6713bb8d471 --- /dev/null +++ b/cypress/test/pages/community/events/index.cy.js @@ -0,0 +1,70 @@ +import Eventindex from "../../../../../pages/community/events"; +import MockApp from "../../../../utils/MockApp"; +import meetings from '../../../../../config/meetings.json'; +import moment from 'moment'; +describe('CommunityIndexPage', () => { + beforeEach(() => { + cy.mount() + }); + + it('displays the basic Events', () => { + cy.get('[data-testid="Events-main"]').should('exist') + cy.contains('Join an AsyncAPI event from anywhere in the world.') + cy.get('[data-testid="Events-Button"]').should('exist') + cy.get(`[href="https://calendar.google.com/calendar/u/3?cid=Y19xOXRzZWlnbG9tZHNqNm5qdWh2YnB0czExY0Bncm91cC5jYWxlbmRhci5nb29nbGUuY29t"]`).should('exist'); + cy.get(`[href="https://calendar.google.com/calendar/ical/c_q9tseiglomdsj6njuhvbpts11c%40group.calendar.google.com/public/basic.ics"]`).should('exist'); + cy.get('[data-testid="TextLink-href" ]').should('have.attr', 'href', 'https://github.com/asyncapi/community/blob/master/MEETINGS_ORGANIZATION.md') + }); + + it('displays recording card', () => { + cy.get('[data-testid="RecordingsCard-img"]').should('exist'); + cy.get('[data-testid="Recordings-Link"]').should('have.attr', 'href', 'https://www.youtube.com/playlist?list=PLbi1gRlP7pijRiA32SU36hD_FW-2qyPhl') + cy.get('[data-testid="Recordings-text"]').should('exist'); + }); + + it('check for Events Filters', () => { + cy.get('[data-testid="EventFilters-main"]').should('exist'); + cy.get('[data-testid="EventFilter-click"]').contains('All').click({ force: true }); + + meetings.forEach((event) => { + cy.contains(event.title).should('be.visible'); + }); + cy.get('[data-testid="EventFilter-click"]').contains('Upcoming').click({ force: true }); + + const currentDate = moment().format('YYYY-MM-DD'); + meetings.forEach((event) => { + if (moment(event.date).isAfter(currentDate)) { + cy.contains(event.title).should('be.visible'); + } + }); + + cy.get('[data-testid="EventFilter-click"]').contains('Recorded').click({ force: true }); + const currentDate1 = moment().format('YYYY-MM-DD'); + meetings.forEach((event) => { + if (moment(event.date).isBefore(currentDate1)) { + cy.contains(event.title).should('be.visible'); + } + }); + }) + + it('check for Events Post Item', () => { + cy.get('[data-testid="EventPostItem-main"]').should('exist'); + }) + + it('Community Meeting Card', () => { + cy.get('[data-testid="EventTypesCard"]').should('exist') + cy.get('[data-testid="Meeting-heading"]').should('exist') + cy.get('[ data-testid="Meeting-paragraph"]').should('exist') + cy.get('[ data-testid="Meeting-host"]').should('exist') + cy.get('[ data-testid="Meeting-link"]').should('exist') + }); + + + it('Other Meeting Cards', () => { + cy.get('[data-testid="EventTypesCard-others"]').should('exist') + cy.get('[data-testid="Meeting-heading"]').should('exist') + cy.get('[ data-testid="Meeting-paragraph"]').should('exist') + cy.get('[ data-testid="Meeting-host"]').should('exist') + cy.get('[ data-testid="Meeting-link"]').should('exist') + }); +}); \ No newline at end of file diff --git a/cypress/test/pages/community/index.cy.js b/cypress/test/pages/community/index.cy.js new file mode 100644 index 00000000000..7eb0b28b3ff --- /dev/null +++ b/cypress/test/pages/community/index.cy.js @@ -0,0 +1,68 @@ +import MockApp from "../../../utils/MockApp"; +import CommunityIndexPage from "../../../../pages/community"; + +describe('CommunityIndexPage', () => { + beforeEach(() => { + cy.mount() + }); + + it('displays the page title & check for first Community Home Card', () => { + cy.contains('AsyncAPI Community Meetings'); + cy.get('[data-testid="CommunityIndex-HomeCard"]').should('exist') + cy.get('[data-testid="HomeCard-main"]').contains('Thanking our AsyncAPI Ambassadors') + cy.get('[data-testid="HomeCard-title"]').contains('Ambassador Programs') + cy.get(`[href="/community/ambassadors"]`).should('exist'); + cy.get('[data-testid="HomeCard-button"]').should('exist'); + cy.get(".bg-ambassador").should('exist') + }); + + it('checks for CommunityIndex Display Card', () => { + cy.get('[data-testid="CommunityIndex-IssuesCard"]').should('exist') + cy.get('[data-testid="Card-lg-bg"]').should('have.class', 'bg-code-editor-dark') + cy.get('[data-testid="Card-lg-tagline"]').should('have.class', 'bg-pink-100') + cy.get('[data-testid="Card-heading-lg"]').should('exist'); + cy.get('[data-testid="Card-desc-lg"]').should('exist'); + cy.get(`[href="/community/dashboard"]`).should('exist'); + }); + + it('should display the Newsroom Card', () => { + cy.get('[data-testid="CommunityIndex-Newsroom-Card"]').should('exist'); + cy.get('[data-testid="Card-lg-bg"]').should('have.class', 'bg-code-editor-dark'); + cy.get('[data-testid="Card-lg-tagline"]').should('have.class', 'bg-pink-100'); + cy.get('[data-testid="Card-heading-lg"]').should('exist'); + cy.get('[data-testid="Card-desc-lg"]').should('exist'); + cy.get('[href="/community/newsroom"]').should('exist'); + }); + + it('should display the Toolings Card', () => { + cy.get('[data-testid="CommunityIndex-Toolings-Card"]').should('exist'); + cy.get('[data-testid="Card-lg-tagline"]').should('exist') + cy.get('[data-testid="Card-heading-lg"]').should('exist') + cy.get('[data-testid="Card-desc-lg"]').should('exist') + cy.get('[href="/tools"]').should('exist'); + }); + + it('should display other cards correctly', () => { + cy.get('[data-testid="CommunityCards-Goals"]').should('exist'); + cy.get('[href="https://github.com/asyncapi/community/discussions/513"]').should('exist'); + cy.get('[data-testid="CommunityCards-Contributors"]').should('exist'); + cy.get('[href="https://github.com/orgs/asyncapi/discussions/593"]').should('exist'); + cy.get('[data-testid="CommunityCards-TSC"]').should('exist'); + cy.get('[href="/community/tsc"]').should('exist'); + }); + + it('should display slack card ', () => { + cy.get('[data-testid="CommunityCards-Slack"]').should('exist'); + cy.get('[data-testid="CommunityIndex-HomeCard"]').should('exist') + cy.get('[data-testid="HomeCard-main"]').contains('All community info, tracked') + cy.get('[data-testid="HomeCard-title"]').contains('AsyncAPI Slack') + cy.get(`[href="https://asyncapi.com/slack-invite"]`).should('exist'); + cy.get('[data-testid="HomeCard-button"]').should('exist'); + cy.get(".bg-channelCover").should('exist') + }); + + it('should display NewsletterSubscribe', () => { + cy.get('[data-testid="CommunityCard-subscribe"]').should('exist'); + cy.get('[data-testid="NewsletterSubscribe-main"]').should('exist'); + }); +}); \ No newline at end of file diff --git a/cypress/test/pages/community/newsroom.cy.js b/cypress/test/pages/community/newsroom.cy.js new file mode 100644 index 00000000000..b3b11e3ea5f --- /dev/null +++ b/cypress/test/pages/community/newsroom.cy.js @@ -0,0 +1,13 @@ +import MockApp from "../../../utils/MockApp"; +import { mount } from "@cypress/react"; +import NewsroomSection from '../../../../pages/community/newsroom' + +describe('Test for Newsroom Section Pages', () => { + it('renders correctly', () => { + mount( + + + + ); + }); +}); \ No newline at end of file diff --git a/cypress/test/pages/community/tsc.cy.js b/cypress/test/pages/community/tsc.cy.js new file mode 100644 index 00000000000..8b1bcdfb2df --- /dev/null +++ b/cypress/test/pages/community/tsc.cy.js @@ -0,0 +1,58 @@ +import MockApp from "../../../utils/MockApp"; +import TSC from '../../../../pages/community/tsc' + +describe('TSC', () => { + beforeEach(() => { + cy.mount() + }); + + it('displays basic TSC ', () => { + cy.get('[data-testid="TSC-content"]').should('exist'); + cy.get(`[href="https://github.com/asyncapi/community/blob/master/TSC_MEMBERSHIP.md"]`).should('exist'); + cy.get('[data-testid="TSC-Governance-Link"]').should('have.attr', 'href', 'https://github.com/asyncapi/community/blob/master/CHARTER.md') + cy.get('[data-testid="TSC-Article-Link"]').should('have.attr', 'href', 'https://www.asyncapi.com/blog/governance-motivation') + cy.get('[data-testid="NewsletterSubscribe-main"]').should('exist') + }); + + it("should display TSC members", () => { + // Check if the "Current TSC members" section is visible + cy.contains("Current TSC members").should("be.visible"); + + // Check if each TSC member card contains the required information + cy.get('[data-testid="UserInfo-list"]').each((member) => { + cy.wrap(member).within(() => { + // Check if the user's name and avatar are visible + cy.get('[data-testid="UserInfo-avatar"]').should("be.visible"); + cy.get('[data-testid="UserInfo-name"]').should("be.visible"); + + // Check if the user's work status is visible + cy.get('[data-testid="status-element"]').should("be.visible"); + + // Check if the social links are visible + cy.get('[data-testid="Social-Links"]').should("have.length.gt", 0); + cy.get('[data-testid="Repo-Links"]').should("have.length.gt", 0); + }); + }); + + }); + + it("should have valid social links", () => { + // Check if each TSC member card's social links are valid + cy.get('[data-testid="UserInfo-list"]').each((member) => { + cy.wrap(member).within(() => { + cy.get('[data-testid="Social-Links"]').each((socialLink) => { + cy.wrap(socialLink) + .should("have.attr", "href") + .and("match", /^(https?:\/\/)/); + }); + }); + }); + }); + + it('displays Question Card ', () => { + cy.get('[data-testid="Question-card"]').should('exist'); + cy.get('[data-testid="Question-card-img"]').should('exist'); + cy.get(`[href="https://github.com/asyncapi/community/blob/master/TSC_MEMBERSHIP.md"]`).should('exist'); + }); +}); + diff --git a/cypress/test/scripts/build-newsroom-videos.cy.js b/cypress/test/scripts/build-newsroom-videos.cy.js new file mode 100644 index 00000000000..34ceab2af87 --- /dev/null +++ b/cypress/test/scripts/build-newsroom-videos.cy.js @@ -0,0 +1,51 @@ +import { buildNewsroomVideos } from '../../../scripts/build-newsroom-videos'; + +describe('Newsroom Videos', () => { + // eslint-disable-next-line cypress/no-async-tests + it('fetches and saves newsroom videos', async () => { + // Define the data that the API should return (stubbed response) + const stubbedResponse = { + items: [ + { + snippet: { + thumbnails: { + high: { + url: 'https://example.com/image.jpg', + }, + }, + title: 'Test Video 1', + description: 'This is a test video 1', + }, + id: { + videoId: 'videoId1', + }, + }, + { + snippet: { + thumbnails: { + high: { + url: 'https://example.com/image2.jpg', + }, + }, + title: 'Test Video 2', + description: 'This is a test video 2', + }, + id: { + videoId: 'videoId2', + }, + }, + ], + }; + + // Intercept the API request and stub the response + cy.intercept('GET', 'https://youtube.googleapis.com/youtube/v3/search*', { + statusCode: 200, + body: stubbedResponse, + }).as('getYoutubeVideos'); + + // Manually trigger the function + await buildNewsroomVideos().then((videoData) => { + expect(videoData).to.exist; + }); + }); +}); \ No newline at end of file diff --git a/cypress/utils/MockApp.js b/cypress/utils/MockApp.js new file mode 100644 index 00000000000..31558164c39 --- /dev/null +++ b/cypress/utils/MockApp.js @@ -0,0 +1,33 @@ +/** + * This file is use to mock the root "_app.js" , so that cypress could directly access refs , contexts and scripts present + * in the "Head" tags , thus by wrapping up pages into MockApp we enable to cypress to access routes , and can mount the + * required pages easily. + */ + +import AppContext from "../../context/AppContext"; +import { MDXProvider } from "../../components/MDX"; +import Layout from "../../components/layout/Layout"; +import AlgoliaSearch from "../../components/AlgoliaSearch"; +import { createRouter } from "./router"; +import MockRouter from "./router"; + +import Head from "next/head"; + +export default function MockApp({ children }) { + return ( + + + + + + +
    + + {children} + +
    +
    +
    +
    + ) +} \ No newline at end of file diff --git a/cypress/utils/router.js b/cypress/utils/router.js index a02a93219b5..f77ae5e4003 100644 --- a/cypress/utils/router.js +++ b/cypress/utils/router.js @@ -1,7 +1,12 @@ +/** + * This file is use to mock the useRouter hook from next.js which is not available otherwise in cypress and enables + * cypress to access router properties like asPath and links. + */ + import React from 'react'; import { RouterContext } from 'next/dist/shared/lib/router-context'; -const createRouter = (params) => ({ +export const createRouter = (params) => ({ route: '/', pathname: '/', query: {}, diff --git a/dashboard.json b/dashboard.json index e3ad886f03f..0f03b47ab6c 100644 --- a/dashboard.json +++ b/dashboard.json @@ -16,17 +16,6 @@ ], "score": 53.988822684860644 }, - { - "id": "PR_kwDOCHlHJM5SLlyl", - "isPR": true, - "isAssigned": false, - "title": "docs: create generator template tutorial", - "author": "Florence-Njeri", - "resourcePath": "/asyncapi/generator/pull/978", - "repo": "asyncapi/generator", - "labels": [], - "score": 33.02507770616476 - }, { "id": "I_kwDOFLhIt84-OUI3", "isPR": false, @@ -47,17 +36,6 @@ ], "score": 32.45072852866624 }, - { - "id": "I_kwDOBGu-185CELGB", - "isPR": false, - "isAssigned": false, - "title": "Work on 3.0 release", - "author": "jonaslagoni", - "resourcePath": "/asyncapi/spec/issues/691", - "repo": "asyncapi/spec", - "labels": [], - "score": 22.68679251119144 - }, { "id": "MDU6SXNzdWU5OTMxODc5ODM=", "isPR": false, @@ -142,26 +120,31 @@ "score": 16.65612614745701 }, { - "id": "PR_kwDOBW5R_c5KIyGW", + "id": "PR_kwDOGPFxkc5Ey7vh", "isPR": true, - "isAssigned": true, - "title": "docs: code-examples", - "author": "sambhavgupta0705", - "resourcePath": "/asyncapi/website/pull/1349", - "repo": "asyncapi/website", - "labels": [], - "score": 16.65612614745701 + "isAssigned": false, + "title": "feat: share spec feature", + "author": "AceTheCreator", + "resourcePath": "/asyncapi/server-api/pull/213", + "repo": "asyncapi/server-api", + "labels": [ + { + "name": "stale", + "color": "ededed" + } + ], + "score": 15.794602381209232 }, { - "id": "PR_kwDOFLhIt85RTiHb", + "id": "PR_kwDOFLhIt85Vmgtj", "isPR": true, "isAssigned": false, - "title": "docs: add flowchart for GSoC23 project in README.md", - "author": "14Richa", - "resourcePath": "/asyncapi/community/pull/719", + "title": "feat: youtube to anchor workflow", + "author": "AnimeshKumar923", + "resourcePath": "/asyncapi/community/pull/805", "repo": "asyncapi/community", "labels": [], - "score": 16.36895155870775 + "score": 14.645904026212197 }, { "id": "PR_kwDOFDnrNc5RUbi_", @@ -173,14 +156,46 @@ "repo": "asyncapi/cli", "labels": [], "score": 14.645904026212197 + }, + { + "id": "MDU6SXNzdWUxMjMwODQwMDM4", + "isPR": false, + "isAssigned": false, + "title": "Usages of allOf within message payload could be flattened", + "author": "jamescrowley", + "resourcePath": "/asyncapi/asyncapi-react/issues/596", + "repo": "asyncapi/asyncapi-react", + "labels": [ + { + "name": "stale", + "color": "ededed" + } + ], + "score": 14.07155484871368 + }, + { + "id": "PR_kwDOFLhIt85TFWOL", + "isPR": true, + "isAssigned": false, + "title": "ci: verify changes to Maintainers.yaml made by the bot", + "author": "14Richa", + "resourcePath": "/asyncapi/community/pull/750", + "repo": "asyncapi/community", + "labels": [ + { + "name": "do-not-merge", + "color": "B60205" + } + ], + "score": 13.497205671215161 } ], "goodFirstIssues": [ { - "id": "I_kwDOBW5R_c5rh81V", - "title": "[📑 Docs]: suggestions on 'create-asyncapi-document.md' file", + "id": "I_kwDOBW5R_c5sqLtN", + "title": "[📑 Docs]: import Glee docs under tools folder", "isAssigned": false, - "resourcePath": "/asyncapi/website/issues/1945", + "resourcePath": "/asyncapi/website/issues/2003", "repo": "asyncapi/website", "author": "AnimeshKumar923", "area": "docs", @@ -192,27 +207,31 @@ ] }, { - "id": "I_kwDOCHlHJM5rH7-B", - "title": "[📑 Docs]: Update versioning docs with info how to check generator version", + "id": "I_kwDOBW5R_c5soAAM", + "title": "Create a research page to have participants sign up for the research study", "isAssigned": false, - "resourcePath": "/asyncapi/generator/issues/1007", - "repo": "asyncapi/generator", - "author": "derberg", - "area": "docs", + "resourcePath": "/asyncapi/website/issues/1991", + "repo": "asyncapi/website", + "author": "Mayaleeeee", + "area": "design", "labels": [ { - "name": "📑 docs", - "color": "E50E99" + "name": "enhancement", + "color": "84b6eb" + }, + { + "name": "🎨 design", + "color": "0D67D3" } ] }, { - "id": "I_kwDOCHlHJM5rH6bF", - "title": "[📑 Docs]: Update usage doc with info about new docker image", + "id": "I_kwDOBW5R_c5rh81V", + "title": "[📑 Docs]: suggestions on 'create-asyncapi-document.md' file", "isAssigned": false, - "resourcePath": "/asyncapi/generator/issues/1006", - "repo": "asyncapi/generator", - "author": "derberg", + "resourcePath": "/asyncapi/website/issues/1945", + "repo": "asyncapi/website", + "author": "AnimeshKumar923", "area": "docs", "labels": [ { @@ -626,16 +645,6 @@ } ] }, - { - "id": "I_kwDOBGu-185myWAv", - "title": "update release workflow in release branch", - "isAssigned": false, - "resourcePath": "/asyncapi/spec/issues/938", - "repo": "asyncapi/spec", - "author": "derberg", - "area": "ci-cd", - "labels": [] - }, { "id": "I_kwDOBW5R_c5mwLzC", "title": "[📑 Docs]: Create an Onboarding guide for technical writers", @@ -730,6 +739,21 @@ } ] }, + { + "id": "I_kwDOE8Qh385hfhvh", + "title": "[📑 Docs]: Use code to represent the internal models", + "isAssigned": false, + "resourcePath": "/asyncapi/modelina/issues/1182", + "repo": "asyncapi/modelina", + "author": "jonaslagoni", + "area": "Unknown", + "labels": [ + { + "name": "📑 docs", + "color": "E50E99" + } + ] + }, { "id": "I_kwDOFi_gUM5hAZlI", "title": "Better logging for MQTT adapter", diff --git a/lib/locales.js b/lib/locales.js new file mode 100644 index 00000000000..fe5067a7675 --- /dev/null +++ b/lib/locales.js @@ -0,0 +1,19 @@ +import { languages, namespaces } from "next-i18next-static-site"; + +function loadLocales() { + // Load all locales, required for next-i18n-static-site + const locales = {}; + languages.map((language) => { + locales[language] = {}; + namespaces.map((namespace) => { + locales[language][namespace] = require("./../locales/" + + language + + "/" + + namespace + + ".json"); + }); + }); + return locales; +} + +export default loadLocales; \ No newline at end of file diff --git a/locales/de/landing-page.json b/locales/de/landing-page.json new file mode 100644 index 00000000000..58efb8c52a3 --- /dev/null +++ b/locales/de/landing-page.json @@ -0,0 +1,6 @@ +{ + "main": { + "header": "Die Zukunft gestalten", + "subHeader": "Ereignisgesteuerte Architekturen (EDA)" + } +} \ No newline at end of file diff --git a/locales/en/landing-page.json b/locales/en/landing-page.json new file mode 100644 index 00000000000..130ec90f16c --- /dev/null +++ b/locales/en/landing-page.json @@ -0,0 +1,6 @@ +{ + "main": { + "header": "Building the future of", + "subHeader": "Event-Driven Architectures (EDA)" + } +} \ No newline at end of file diff --git a/next-i18next-static-site.config.js b/next-i18next-static-site.config.js new file mode 100644 index 00000000000..e42b98ca03e --- /dev/null +++ b/next-i18next-static-site.config.js @@ -0,0 +1,8 @@ +module.exports = { + i18n: { + languages: ["en", "de"], + defaultLanguage: "en", + namespaces: ["landing-page"], + defaultNamespace: "landing-page", + }, +}; \ No newline at end of file diff --git a/next.config.js b/next.config.js index 4fee80f9ea7..3795898a677 100644 --- a/next.config.js +++ b/next.config.js @@ -1,9 +1,10 @@ -const frontmatter = require('remark-frontmatter') -const images = require('remark-images') -const gemoji = require('remark-gemoji-to-emoji') -const a11yEmoji = require('@fec/remark-a11y-emoji') -const slug = require('remark-slug') -const headingId = require('remark-heading-id') +const frontmatter = require('remark-frontmatter'); +const images = require('remark-images'); +const gemoji = require('remark-gemoji-to-emoji'); +const a11yEmoji = require('@fec/remark-a11y-emoji'); +const slug = require('remark-slug'); +const headingId = require('remark-heading-id'); +const { i18n } = require("./next-i18next-static-site.config"); const withMDX = require('@next/mdx')({ extension: /\.mdx?$/, @@ -18,8 +19,11 @@ const withMDX = require('@next/mdx')({ ], rehypePlugins: [], }, -}) -module.exports = withMDX({ +}); + +const withTM = require("next-transpile-modules")(["next-i18next-static-site"]); + +module.exports = withTM(withMDX({ pageExtensions: ['js', 'md'], eslint: { ignoreDuringBuilds: true, @@ -33,6 +37,9 @@ module.exports = withMDX({ // config.resolve.alias["react/jsx-dev-runtime"] = require.resolve('react/jsx-dev-runtime'); // config.resolve.alias["react/jsx-runtime"] = require.resolve('react/jsx-runtime'); - return config + return config; + }, + publicRuntimeConfig: { + i18n, }, -}) \ No newline at end of file +})); diff --git a/package-lock.json b/package-lock.json index a816679fecd..7a9f82c3214 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,13 +42,16 @@ "mermaid": "9.3.0", "moment": "^2.29.4", "next": "^12.0.0", + "next-i18next-static-site": "^0.3.1", "next-mdx-remote": "^4.4.1", + "next-transpile-modules": "^10.0.0", "node-fetch": "^2.6.7", "postcss": "^8.4.14", "react": "^17.0.2", "react-dom": "^17.0.2", "react-ga": "^3.1.2", "react-gtm-module": "^2.0.11", + "react-i18next": "^13.0.1", "react-scrollspy": "^3.4.2", "react-syntax-highlighter": "12.2.1", "react-text-truncate": "^0.16.0", @@ -482,11 +485,14 @@ } }, "node_modules/@babel/runtime": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz", - "integrity": "sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/template": { @@ -4849,6 +4855,18 @@ "once": "^1.4.0" } }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", @@ -5985,8 +6003,7 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/gray-matter": { "version": "4.0.3", @@ -6383,6 +6400,14 @@ "node": "*" } }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "dependencies": { + "void-elements": "3.1.0" + } + }, "node_modules/html-void-elements": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", @@ -6439,6 +6464,29 @@ "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" }, + "node_modules/i18next": { + "version": "21.10.0", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.10.0.tgz", + "integrity": "sha512-YeuIBmFsGjUfO3qBmMOc0rQaun4mIpGKET5WDwvu8lU7gvwpcariZLNtL0Fzj+zazcHUrlXHiptcFhBMFaxzfg==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "peer": true, + "dependencies": { + "@babel/runtime": "^7.17.2" + } + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -7196,6 +7244,14 @@ "resolved": "https://registry.npmjs.org/jgexml/-/jgexml-0.4.4.tgz", "integrity": "sha512-j0AzSWT7LXy3s3i1cdv5NZxUtscocwiBxgOLiEBfitCehm8STdXVrcOlbAWsJFLCq1elZYpQlGqA9k8Z+n9iJA==" }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "engines": { + "node": ">=14" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -9049,6 +9105,21 @@ } } }, + "node_modules/next-i18next-static-site": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/next-i18next-static-site/-/next-i18next-static-site-0.3.1.tgz", + "integrity": "sha512-rl5kdst++xucZz6kVOQfXNc/ZGYJyjq8sfSkFxthV3qnnP17bWq6C8uLyDOHMV98DbujG28To7MW5yH+//Od+g==", + "dependencies": { + "js-cookie": "^3.0.1" + }, + "peerDependencies": { + "i18next": "^21.10.0", + "js-cookie": "^3.0.1", + "next": "^13.0.0", + "react": "^18.2.0", + "react-i18next": "^11.18.6" + } + }, "node_modules/next-mdx-remote": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/next-mdx-remote/-/next-mdx-remote-4.4.1.tgz", @@ -9084,6 +9155,14 @@ "react": ">=16" } }, + "node_modules/next-transpile-modules": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/next-transpile-modules/-/next-transpile-modules-10.0.0.tgz", + "integrity": "sha512-FyeJ++Lm2Fq31gbThiRCrJlYpIY9QaI7A3TjuhQLzOix8ChQrvn5ny4MhfIthS5cy6+uK1AhDRvxVdW17y3Xdw==", + "dependencies": { + "enhanced-resolve": "^5.10.0" + } + }, "node_modules/node-abi": { "version": "3.40.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.40.0.tgz", @@ -10478,11 +10557,6 @@ "react-is": "^16.8.1" } }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/property-information": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", @@ -10719,6 +10793,32 @@ "resolved": "https://registry.npmjs.org/react-gtm-module/-/react-gtm-module-2.0.11.tgz", "integrity": "sha512-8gyj4TTxeP7eEyc2QKawEuQoAZdjKvMY4pgWfycGmqGByhs17fR+zEBs0JUDq4US/l+vbTl+6zvUIx27iDo/Vw==" }, + "node_modules/react-i18next": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-13.0.1.tgz", + "integrity": "sha512-gMO6N2GfSfuH7xlHSsZ/mZf+Py9bLm/+EDKIn5fNTuDTjcCcwmMU5UEuGCDk5mdfivbo7ySyYXBN7B9tbGUxiA==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "html-parse-stringify": "^3.0.1" + }, + "peerDependencies": { + "i18next": ">= 23.2.3", + "react": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/react-scrollspy": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/react-scrollspy/-/react-scrollspy-3.4.3.tgz", @@ -10933,9 +11033,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regexp-tree": { "version": "0.1.27", @@ -12046,6 +12146,14 @@ "node": ">= 6" } }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", @@ -12793,6 +12901,14 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -13330,11 +13446,11 @@ } }, "@babel/runtime": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz", - "integrity": "sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" } }, "@babel/template": { @@ -16666,6 +16782,15 @@ "once": "^1.4.0" } }, + "enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, "enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", @@ -17669,8 +17794,7 @@ "graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "gray-matter": { "version": "4.0.3", @@ -17984,6 +18108,14 @@ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.10.tgz", "integrity": "sha512-RoV7OkQm0T3os3Dd2VHLNMoaoDVx77Wygln3n9l5YV172XonWG6rgQD3XnF/BuFFZw9A0TJgmMSO8FEWQgvcXw==" }, + "html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "requires": { + "void-elements": "3.1.0" + } + }, "html-void-elements": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", @@ -18026,6 +18158,15 @@ "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" }, + "i18next": { + "version": "21.10.0", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.10.0.tgz", + "integrity": "sha512-YeuIBmFsGjUfO3qBmMOc0rQaun4mIpGKET5WDwvu8lU7gvwpcariZLNtL0Fzj+zazcHUrlXHiptcFhBMFaxzfg==", + "peer": true, + "requires": { + "@babel/runtime": "^7.17.2" + } + }, "iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -18670,6 +18811,11 @@ "resolved": "https://registry.npmjs.org/jgexml/-/jgexml-0.4.4.tgz", "integrity": "sha512-j0AzSWT7LXy3s3i1cdv5NZxUtscocwiBxgOLiEBfitCehm8STdXVrcOlbAWsJFLCq1elZYpQlGqA9k8Z+n9iJA==" }, + "js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -20055,6 +20201,14 @@ "use-sync-external-store": "1.2.0" } }, + "next-i18next-static-site": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/next-i18next-static-site/-/next-i18next-static-site-0.3.1.tgz", + "integrity": "sha512-rl5kdst++xucZz6kVOQfXNc/ZGYJyjq8sfSkFxthV3qnnP17bWq6C8uLyDOHMV98DbujG28To7MW5yH+//Od+g==", + "requires": { + "js-cookie": "^3.0.1" + } + }, "next-mdx-remote": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/next-mdx-remote/-/next-mdx-remote-4.4.1.tgz", @@ -20077,6 +20231,14 @@ } } }, + "next-transpile-modules": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/next-transpile-modules/-/next-transpile-modules-10.0.0.tgz", + "integrity": "sha512-FyeJ++Lm2Fq31gbThiRCrJlYpIY9QaI7A3TjuhQLzOix8ChQrvn5ny4MhfIthS5cy6+uK1AhDRvxVdW17y3Xdw==", + "requires": { + "enhanced-resolve": "^5.10.0" + } + }, "node-abi": { "version": "3.40.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.40.0.tgz", @@ -21140,13 +21302,6 @@ "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.8.1" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } } }, "property-information": { @@ -21343,6 +21498,20 @@ "resolved": "https://registry.npmjs.org/react-gtm-module/-/react-gtm-module-2.0.11.tgz", "integrity": "sha512-8gyj4TTxeP7eEyc2QKawEuQoAZdjKvMY4pgWfycGmqGByhs17fR+zEBs0JUDq4US/l+vbTl+6zvUIx27iDo/Vw==" }, + "react-i18next": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-13.0.1.tgz", + "integrity": "sha512-gMO6N2GfSfuH7xlHSsZ/mZf+Py9bLm/+EDKIn5fNTuDTjcCcwmMU5UEuGCDk5mdfivbo7ySyYXBN7B9tbGUxiA==", + "requires": { + "@babel/runtime": "^7.22.5", + "html-parse-stringify": "^3.0.1" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "react-scrollspy": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/react-scrollspy/-/react-scrollspy-3.4.3.tgz", @@ -21536,9 +21705,9 @@ } }, "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "regexp-tree": { "version": "0.1.27", @@ -22429,6 +22598,11 @@ } } }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + }, "tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", @@ -23000,6 +23174,11 @@ "unist-util-stringify-position": "^3.0.0" } }, + "void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==" + }, "wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", diff --git a/package.json b/package.json index 859c6017879..ddc7761fc15 100644 --- a/package.json +++ b/package.json @@ -70,13 +70,16 @@ "mermaid": "9.3.0", "moment": "^2.29.4", "next": "^12.0.0", + "next-i18next-static-site": "^0.3.1", "next-mdx-remote": "^4.4.1", + "next-transpile-modules": "^10.0.0", "node-fetch": "^2.6.7", "postcss": "^8.4.14", "react": "^17.0.2", "react-dom": "^17.0.2", "react-ga": "^3.1.2", "react-gtm-module": "^2.0.11", + "react-i18next": "^13.0.1", "react-scrollspy": "^3.4.2", "react-syntax-highlighter": "12.2.1", "react-text-truncate": "^0.16.0", diff --git a/pages/[lang]/index.js b/pages/[lang]/index.js new file mode 100644 index 00000000000..36bf2189bda --- /dev/null +++ b/pages/[lang]/index.js @@ -0,0 +1,271 @@ +import React from 'react'; +import Container from '../../components/layout/Container'; +import NavBar from '../../components/navigation/NavBar'; +import Hero from '../../components/Hero'; +import NewsletterSubscribe from '../../components/NewsletterSubscribe'; +import Sponsors from '../../components/sponsors/Sponsors'; +import Head from '../../components/Head'; +import Slack from '../../components/slack'; +import Button from '../../components/buttons/Button'; +import Calendar from '../../components/Calendar'; +import AdidasLogo from '../../components/logos/Adidas'; +import AxwayLogo from '../../components/logos/Axway'; +import SlackLogo from '../../components/logos/Slack'; +import SalesforceLogo from '../../components/logos/Salesforce'; +import SapLogo from '../../components/logos/SAP'; +import Testimonial from '../../components/Testimonial'; +import Heading from '../../components/typography/Heading'; +import Paragraph from '../../components/typography/Paragraph'; +import TextLink from '../../components/typography/TextLink'; +import GoldSponsors from '../../components/sponsors/GoldSponsors'; +import SilverSponsors from '../../components/sponsors/SilverSponsors'; +import SupportUs from '../../components/SupportUs/SupportUs'; +import StickyNavbar from '../../components/navigation/StickyNavbar'; +import GoogleCalendarButton from '../../components/buttons/GoogleCalendarButton'; +import ICSFileButton from '../../components/buttons/ICSFileButton'; +import SubscribeButton from '../../components/buttons/SubscribeButton'; +import NewsroomSection from '../../components/newsroom/NewsroomSection'; +import { + getAllLanguageSlugs, + getLanguage, +} from "next-i18next-static-site"; + +function HomePage() { + return ( + <> + + + + + +
    + + + + + + + Adopted by the world leading brands + + + These brands are already using AsyncAPI in production. Is your company using AsyncAPI and wants to be included in this list? + + Let us know here! + + +
      +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    +
    + +
    + + + +
    + + + + Join our great community! + + + We're a community of great people who are passionate about AsyncAPI and event-driven architectures. + +
    + +
    +
    + +
    +
    +
    + + Join our Slack workspace + + + We welcome everyone to join our Slack workspace. If you have a question on how to use AsyncAPI, want to contribute, or simply want to say hello 👋  you're welcome to join us. We're nice people 🙂 + +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + + Join our public meetings + + + AsyncAPI hosts different meetings every week. They are focused on different topics, sometimes purely technical and sometimes about community building. Pick one and join us! + + + Learn more about our meetings. + + +
      +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    +
    +
    +
    +
    + + + +
    +
    + +
    + + + Platinum Sponsors + + + + + + + Gold Sponsors + + + + + + + Silver Sponsors + + + + + + + Want to Sponsor Us? + + + These great organizations are already supporting AsyncAPI. Want to become a sponsor? + + Support us! + + + +
    + + + Supported by + + + The following companies support us by letting us use their products for free. Interested in supporting us too? + + Email us + for more info. + + + + + + What the experts are saying + +
      + + + + +
    +
    +
    + + ); +} + +export default HomePage; + +export async function getStaticPaths() { + const paths = getAllLanguageSlugs(); + return { + paths, + fallback: false, + }; +} + +export async function getStaticProps({ params }) { + const language = getLanguage(params.lang); + return { + props: { + language, + }, + }; +} diff --git a/pages/_app.js b/pages/_app.js index 7b3a41781ac..3f61b533ff4 100644 --- a/pages/_app.js +++ b/pages/_app.js @@ -6,29 +6,49 @@ import Footer from '../components/footer/Footer' import { MDXProvider } from '../components/MDX'; import AlgoliaSearch from '../components/AlgoliaSearch'; import ScrollButton from '../components/buttons/ScrollButton'; - +import { + I18nProvider, + languages, + defaultLanguage, + namespaces, + defaultNamespace, +} from "next-i18next-static-site"; +import loadLocales from "../lib/locales"; import '../styles/globals.css' -export default function App({ Component, pageProps, router }) { +function App({ Component, pageProps, router }) { + + const i18n = { + languages, + defaultLanguage, + namespaces, + defaultNamespace, + locales: loadLocales(), + }; + return ( - - - - - - -
    - - - - - -
    -
    + + + + + + + +
    + + + + + +
    +
    +
    -
    - - - + + + + ) } + +export default App; \ No newline at end of file diff --git a/pages/casestudies/index.js b/pages/casestudies/index.js index f7300637164..567a154e3ff 100644 --- a/pages/casestudies/index.js +++ b/pages/casestudies/index.js @@ -4,6 +4,8 @@ import Paragraph from '../../components/typography/Paragraph'; import TextLink from '../../components/typography/TextLink'; import Heading from "../../components/typography/Heading"; import CaseStudiesList from "../../config/case-studies.json"; +import { +} from "next-i18next-static-site"; export default function casestudies() { const description = @@ -21,29 +23,27 @@ export default function casestudies() {
    -
    +
    - {title} - + {title} + - The best way to learn how to use AsyncAPI is not only through documentation that usually is focused on recommendations and best practices. - It is also good to confront with real-life case studies that explain how people really use AsyncAPI and what are their flows. + The best way to learn how to use AsyncAPI is not only through documentation that usually is focused on recommendations and best practices. + It is also good to confront with real-life case studies that explain how people really use AsyncAPI and what are their flows. - Feel free to submit your case study. We have a template for you. For more details - - read our FAQ - . + Feel free to submit your case study. We have a template for you. For more details + + read our FAQ + .
    - +
    ); } - - diff --git a/pages/community/ambassadors/index.js b/pages/community/ambassadors/index.js index a68f9cbd5e6..f8e5f358322 100644 --- a/pages/community/ambassadors/index.js +++ b/pages/community/ambassadors/index.js @@ -9,7 +9,7 @@ import ambassadorList from '../../../config/ambassador_lists.json' import Link from 'next/link'; -function addAdditionalUserInfo(user) { +export function addAdditionalUserInfo(user) { const userData = { ...user, }; @@ -43,9 +43,9 @@ function Index() { image={image} wide > -
    -
    -

    +
    +
    +

    Teachers. Champions.{' '} Ambassadors!

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

    +

    Join an AsyncAPI event from anywhere in the world.

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