From 492bce484edc22203eb44d4cf6a12dd4fa03027c Mon Sep 17 00:00:00 2001 From: Lukasz Gornicki Date: Thu, 16 Oct 2025 20:03:51 +0200 Subject: [PATCH 1/8] chore: add content with case studies --- config/usecases.yaml | 134 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 config/usecases.yaml diff --git a/config/usecases.yaml b/config/usecases.yaml new file mode 100644 index 000000000000..b7a68af3766c --- /dev/null +++ b/config/usecases.yaml @@ -0,0 +1,134 @@ +description: "All use cases related to AsyncAPI collectively contribute to most important aspect of software development, which is costs reduction. For example with `Infrastructure as Code` instead of enabling costly on-demand topic provisioning in your broker, you can automate it safely using AsyncAPI contracts. Before you provision new topics, you can first validate if it this is not causing duplicates and unnecessary costs increase. Use case like `Governance and Consistency` or `Developer Portal` significantly contributes to adoption of events infrastructure in consistent way and makes onboarding faster, that directly converts to cost reduction." +usecases: + infraascode: + title: Infrastructure as Code + description: This makes them a great fit for Infrastructure as Code. DevOps teams can use AsyncAPI contracts to automatically provision topics, assign access rights, and configure brokers. Instead of manual setup, everything is declarative and repeatable. + testing: + title: Testing and Mocking + description: "You don’t need to wait for producers to deploy before you start building consumers. Once teams agree on the event structure, you can capture it in an AsyncAPI contract and generate mocks directly. This lets developers test consumers against simulated producers, speeding up development and avoiding bottlenecks." + docs: + title: Developer Portal and Discoverability + description: Generate documentation and share across entire organization which events exist, who produces them, who consumes them, and how traffic flows. This makes onboarding easier and promotes cross-team visibility. Identify what consumers will be affected by event changes introduced by producers. + governanace: + title: Governance and Consistency + description: Assure consistency across your event ecosystem. You can validate contracts to ensure topic names follow organizational standards, check that no sensitive information is exposed, and apply custom rules through linting. This builds governance into the development lifecycle without slowing teams down. + selfservice: + title: Self-Service + description: "Because AsyncAPI is machine-readable, it’s perfect for building self-service platforms. Teams can submit their contracts to a central service, which automatically validates schemas, publishes them to a shared registry, and provisions broker resources. This enables faster time-to-production while keeping standards and compliance intact." + codegen: + title: Code Generation + description: AsyncAPI helps eliminate boilerplate code. You can start by generating strongly typed models from message schemas and go further by producing client libraries or even SDKs. This accelerates development, reduces human error, and ensures producers and consumers always stay aligned with the contract. + extensibility: + title: Extensibility - Quality of Service Monitoring + description: AsyncAPI supports extensions, so you can enrich contracts with operational requirements like SLA or QoS details. For example, an IoT device might declare its expected latency or throughput. Monitoring tools can read these extensions, track service quality, and raise alerts when metrics fall below agreed levels. +data: + raiffeisen: + name: Raiffeisen Bank + description: + type: Video + url: + kuehne: + name: Kuehne+Nagel + description: + type: Slides + url: + postman: + name: Postman + description: + type: Video + url: + lego1: + name: LEGO Group + description: + type: Video + url: + lego2: + name: LEGO Group + description: + type: Video + url: + newzealand: + name: Bank of New Zealand + description: + type: Video + url: + schwarz: + name: Schwarz Group + description: + type: Video??? + url: + walmart: + name: Walmart + description: + type: Video + url: + ebay: + name: eBay + description: + type: Video + url: + universitycatalonia: + name: Open University of Catalonia + description: + type: Video + url: + transfergo: + name: TransferGo + description: + type: Video + url: + adeo: + name: Adeo + description: + type: Video + url: + hdi: + name: HDI Global SE + description: + type: Video + url: + adobe: + name: Adobe + description: + type: Video + url: + oracle: + name: Oracle + description: + type: Video + url: + adidas: + name: Adidas + description: + type: Video + url: + sap: + name: SAP + description: + type: Video + url: + lombard: + name: Lombard Odier + description: + type: Video + url: + zora: + name: Zora Robotics + description: + type: Video + url: + morgan: + name: Morgan Stanley + description: + type: Video + url: + siemens: + name: Siemens + description: + type: Video + url: + pagopa: + name: PagoPA + description: + type: Video + url: \ No newline at end of file From b194f278c6a6abc0c46f833530b9dfb70ff0e4fd Mon Sep 17 00:00:00 2001 From: Lukasz Gornicki Date: Thu, 16 Oct 2025 20:54:39 +0200 Subject: [PATCH 2/8] update resources from adopters --- config/adopters.yml | 95 ------------------------------- config/usecases.yaml | 132 +++++++++++++++++++++---------------------- 2 files changed, 66 insertions(+), 161 deletions(-) delete mode 100644 config/adopters.yml diff --git a/config/adopters.yml b/config/adopters.yml deleted file mode 100644 index 456ac537a4fb..000000000000 --- a/config/adopters.yml +++ /dev/null @@ -1,95 +0,0 @@ -- companyName: Reiffeisen Bank - useCase: Implementing a Continuous Integration and Continuous Delivery (CI/CD) pipeline utilizing GitOps principles to deploy a topology constructed on AsyncAPI definitions using a Kubernetes operator to an Apache Pulsar cluster. - resources: - - title: "Video: From an AsyncAPI Definition to a Deployed Pulsar Topology Via GitOps" - link: https://www.youtube.com/watch?v=_MwzLZMwFN8 - -- companyName: LEGO Group - useCase: Managing brokers, where developers abstain from direct access to the management console and instead upload AsyncAPI documents to a self-service API, which provisions access and topics specified in the documents. - resources: - - title: "Video: Documentation as Configuration for Management of Apache Pulsar" - link: https://www.youtube.com/watch?v=m8I0fYjx6Cc - -- companyName: LEGO Group - useCase: Defining, documenting, and distributing event-driven APIs while ensuring consistency and governance. - resources: - - title: "Video: Cross-Domain Events with AsyncAPI and AWS" - link: https://www.youtube.com/watch?v=qjarcJQVLOg - -- companyName: Bank of New Zealand - useCase: Establishing a decentralized company-wide governance strategy for APIs, providing a self-service platform for publishing APIs and documentation. - resources: - - title: "Video: Self-service Events & Decentralised Governance with AsyncAPI: A Real World Example" - link: https://www.confluent.io/events/kafka-summit-apac-2021/self-service-events-and-decentralised-governance-with-asyncapi-a-real-world/ - -- companyName: Zora Robotics - useCase: Documenting public MQTT APIs for IoT products and constructing a developer portal. - resources: - - title: "Video: Building and managing an extensive API for Robotics and IoT" - link: https://www.youtube.com/watch?v=yjHgT0n2BtA - - title: "Docs: Building and managing an extensive API for Robotics and IoT" - link: https://docs.zorabots.be/dev-mqtt-docs/latest/index.html - -- companyName: Walmart - useCase: Managing a centralized API Hub for internal teams, enhancing event discoverability and visibility using AsyncAPI. AsyncAPI facilitates company-wide governance on asynchronous APIs. - resources: - - title: "Video: Time For AsyncAPI Specification" - link: https://www.youtube.com/watch?v=SxTpGRaNIPo - -- companyName: eBay - useCase: Facilitating partner integration with eBay through asynchronous communication, leveraging public AsyncAPI documents for code generation and rapid integration, while ensuring governance and standardization. - resources: - - title: "Video: AsyncAPI 2.0: Enabling the Event-Driven World" - link: https://www.youtube.com/watch?v=SxTpGRaNIPo - - title: "Article: AsyncAPI 2.0: Enabling the Event-Driven World" - link: https://innovation.ebayinc.com/tech/engineering/asyncapi-2-0-enabling-the-event-driven-world/ - - title: "Docs: Overview of Notification API with public AsyncAPI documents" - link: https://developer.ebay.com/api-docs/commerce/notification/overview.html - -- companyName: Postman - useCase: Enhancing discoverability of information about system events by building a tool called Synapse for provisioning entire event-based infrastructure, with AsyncAPI documents as the source of truth. - resources: - - title: "Video: Turbocharging your Developer Ecosystem with Events Powered by SNS/SQS, Serverless, and AsyncAPI" - link: https://www.youtube.com/watch?v=0_7QZyKLPoE - -- companyName: Adobe - useCase: Providing event documentation to expedite development by generating classes based on message payload information from AsyncAPI documents. - resources: - - title: "Slides: AsyncAPI and Modelina" - link: https://drive.google.com/file/d/1AVCG9_fFtuOtrvZVZWENmU2aDT7C51Jr/view?usp=sharing - -- companyName: Open University of Catalonia and Prodevelop - useCase: Enabling monitoring of ports through a design-first approach, utilizing UML class diagrams to design the entire infrastructure. UML diagrams are source of truth for generated AsyncAPI documents that later are used for models and clients generation. These documents are extended with additional SLA properties to specify runtime quality of service requirements, facilitating real-time monitoring. - resources: - - title: "Video: Leveraging AsyncAPI To Detect Anomalies in Smart Ports Platforms" - link: https://www.youtube.com/watch?v=m4KS6FSeTT4 - -- companyName: Oracle - useCase: Documenting data streaming APIs with AsyncAPI documents for client library generation in various programming languages, reducing development time for applications consuming data. - resources: - - title: "Video: Productizing AsyncAPI for Data Replication" - link: https://www.youtube.com/watch?v=CGLlxYy66LY - -- companyName: TransferGo - useCase: Enhancing discoverability of information about event-driven systems by documenting services with AsyncAPI, rendering documentation, and creating catalogs of events. Legacy services utilize a special library to generate AsyncAPI documents, while new services require AsyncAPI documents for generating PHP classes. - resources: - - title: "Slides: How TransferGo Uses AsyncAPI To Improve Developer Experience" - link: https://drive.google.com/file/d/1t7tYMr8FMRInaZV0lWod1QfDuhhSjwBJ/view?usp=sharing - -- companyName: Kuehne+Nagel - useCase: Implementing a GitOps-based pipeline to enable self-service management of Kafka infrastructure, including access control management. Automation of AsyncAPI document governance ensures consistency in the infrastructure at the pull request level. - resources: - - title: "Slides: AsyncAPI For Platform Self-Service: A GitOps Tale" - link: https://drive.google.com/file/d/1y67PI8NaITPPwZAiDF2Zs7ISfcIpqMV8/view?usp=sharing - -- companyName: Adidas - useCase: AsyncAPI is a standard for defining asynchronous APIs using Apache Kafka. AsyncAPI governed under official guidelines. AsyncAPI is promoted to be used for documentation and code generation. - resources: - - title: "Docs: AsyncAPI and Kafka Guidelines" - link: https://adidas.gitbook.io/api-guidelines/asynchronous-api-guidelines/kafka-asynchronous-guidelines/a_introduction/why-asyncapi - -- companyName: Morgan Stanley - useCase: AsyncAPI is promoted not only inside the company but also as a standard for FinOS Foundation for managing architecture as code. - resources: - - title: "Slides: Deploying WebSockets with AsyncAPI and Architecture as Code" - link: https://drive.google.com/file/d/1YzLwQZsMUXGwj_Lsqv-ZnvV2knuowWrS/view?usp=drive_link diff --git a/config/usecases.yaml b/config/usecases.yaml index b7a68af3766c..3280a594fe43 100644 --- a/config/usecases.yaml +++ b/config/usecases.yaml @@ -9,7 +9,7 @@ usecases: docs: title: Developer Portal and Discoverability description: Generate documentation and share across entire organization which events exist, who produces them, who consumes them, and how traffic flows. This makes onboarding easier and promotes cross-team visibility. Identify what consumers will be affected by event changes introduced by producers. - governanace: + governance: title: Governance and Consistency description: Assure consistency across your event ecosystem. You can validate contracts to ensure topic names follow organizational standards, check that no sensitive information is exposed, and apply custom rules through linting. This builds governance into the development lifecycle without slowing teams down. selfservice: @@ -24,109 +24,109 @@ usecases: data: raiffeisen: name: Raiffeisen Bank - description: + description: Implementing a Continuous Integration and Continuous Delivery (CI/CD) pipeline utilizing GitOps principles to deploy a topology constructed on AsyncAPI definitions using a Kubernetes operator to an Apache Pulsar cluster. type: Video - url: - kuehne: - name: Kuehne+Nagel - description: - type: Slides - url: - postman: - name: Postman - description: - type: Video - url: + url: https://www.youtube.com/watch?v=_MwzLZMwFN8 lego1: name: LEGO Group - description: + description: Managing brokers, where developers abstain from direct access to the management console and instead upload AsyncAPI documents to a self-service API, which provisions access and topics specified in the documents. type: Video - url: + url: https://www.youtube.com/watch?v=m8I0fYjx6Cc lego2: name: LEGO Group - description: + description: Defining, documenting, and distributing event-driven APIs while ensuring consistency and governance. type: Video - url: + url: https://www.youtube.com/watch?v=qjarcJQVLOg newzealand: name: Bank of New Zealand - description: + description: Establishing a decentralized company-wide governance strategy for APIs, providing a self-service platform for publishing APIs and documentation. type: Video - url: - schwarz: - name: Schwarz Group - description: - type: Video??? - url: + url: https://www.confluent.io/events/kafka-summit-apac-2021/self-service-events-and-decentralised-governance-with-asyncapi-a-real-world/ + zora: + name: Zora Robotics + description: Documenting public MQTT APIs for IoT products and constructing a developer portal. + type: Video + url: https://www.youtube.com/watch?v=yjHgT0n2BtA walmart: name: Walmart - description: + description: Managing a centralized API Hub for internal teams, enhancing event discoverability and visibility using AsyncAPI. AsyncAPI facilitates company-wide governance on asynchronous APIs. type: Video - url: + url: https://www.youtube.com/watch?v=SxTpGRaNIPo ebay: name: eBay - description: + description: Facilitating partner integration with eBay through asynchronous communication, leveraging public AsyncAPI documents for code generation and rapid integration, while ensuring governance and standardization. type: Video - url: + url: https://www.youtube.com/watch?v=SxTpGRaNIPo + postman: + name: Postman + description: Enhancing discoverability of information about system events by building a tool called Synapse for provisioning entire event-based infrastructure, with AsyncAPI documents as the source of truth. + type: Video + url: https://www.youtube.com/watch?v=0_7QZyKLPoE + adobe: + name: Adobe + description: Providing event documentation to expedite development by generating classes based on message payload information from AsyncAPI documents. + type: Slides + url: https://drive.google.com/file/d/1AVCG9_fFtuOtrvZVZWENmU2aDT7C51Jr/view?usp=sharing universitycatalonia: - name: Open University of Catalonia - description: + name: Open University of Catalonia and Prodevelop + description: Enabling monitoring of ports through a design-first approach, utilizing UML class diagrams to design the entire infrastructure. UML diagrams are source of truth for generated AsyncAPI documents that later are used for models and clients generation. These documents are extended with additional SLA properties to specify runtime quality of service requirements, facilitating real-time monitoring. + type: Video + url: https://www.youtube.com/watch?v=m4KS6FSeTT4 + oracle: + name: Oracle + description: Documenting data streaming APIs with AsyncAPI documents for client library generation in various programming languages, reducing development time for applications consuming data. type: Video - url: + url: https://www.youtube.com/watch?v=CGLlxYy66LY transfergo: - name: TransferGo + name: TransferGo + description: Enhancing discoverability of information about event-driven systems by documenting services with AsyncAPI, rendering documentation, and creating catalogs of events. Legacy services utilize a special library to generate AsyncAPI documents, while new services require AsyncAPI documents for generating PHP classes. + type: Slides + url: https://drive.google.com/file/d/1t7tYMr8FMRInaZV0lWod1QfDuhhSjwBJ/view?usp=sharing + kuehne: + name: Kuehne+Nagel + description: Implementing a GitOps-based pipeline to enable self-service management of Kafka infrastructure, including access control management. Automation of AsyncAPI document governance ensures consistency in the infrastructure at the pull request level. + type: Slides + url: https://drive.google.com/file/d/1y67PI8NaITPPwZAiDF2Zs7ISfcIpqMV8/view?usp=sharing + adidas: + name: Adidas + description: AsyncAPI is a standard for defining asynchronous APIs using Apache Kafka. AsyncAPI governed under official guidelines. AsyncAPI is promoted to be used for documentation and code generation. + type: Docs + url: https://adidas.gitbook.io/api-guidelines/asynchronous-api-guidelines/kafka-asynchronous-guidelines/a_introduction/why-asyncapi + morgan: + name: Morgan Stanley + description: AsyncAPI is promoted not only inside the company but also as a standard for FinOS Foundation for managing architecture as code. + type: Slides + url: https://drive.google.com/file/d/1YzLwQZsMUXGwj_Lsqv-ZnvV2knuowWrS/view?usp=drive_link + schwarz: + name: Schwarz Group description: type: Video - url: + url: adeo: - name: Adeo + name: Adeo description: type: Video - url: + url: hdi: - name: HDI Global SE - description: - type: Video - url: - adobe: - name: Adobe + name: HDI Global SE description: type: Video - url: - oracle: - name: Oracle - description: - type: Video - url: - adidas: - name: Adidas - description: - type: Video - url: + url: sap: - name: SAP + name: SAP description: type: Video - url: + url: lombard: name: Lombard Odier description: type: Video - url: - zora: - name: Zora Robotics - description: - type: Video - url: - morgan: - name: Morgan Stanley - description: - type: Video - url: + url: siemens: name: Siemens description: type: Video - url: + url: pagopa: name: PagoPA description: From 34506bb62b85c17d773ad4d4229b5b4e42ade92d Mon Sep 17 00:00:00 2001 From: Lukasz Gornicki Date: Fri, 17 Oct 2025 09:23:37 +0200 Subject: [PATCH 3/8] some more content --- config/usecases.yaml | 48 ++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/config/usecases.yaml b/config/usecases.yaml index 3280a594fe43..2f6c054de2cb 100644 --- a/config/usecases.yaml +++ b/config/usecases.yaml @@ -79,9 +79,9 @@ data: url: https://www.youtube.com/watch?v=CGLlxYy66LY transfergo: name: TransferGo - description: Enhancing discoverability of information about event-driven systems by documenting services with AsyncAPI, rendering documentation, and creating catalogs of events. Legacy services utilize a special library to generate AsyncAPI documents, while new services require AsyncAPI documents for generating PHP classes. - type: Slides - url: https://drive.google.com/file/d/1t7tYMr8FMRInaZV0lWod1QfDuhhSjwBJ/view?usp=sharing + description: TransferGo uses the AsyncAPI specification as the essential, standardized blueprint for their event-driven microservices, enabling automated documentation (Event Catalog), continuous validation, and reliable contract testing (Microcks) to ensure clarity and trust across their system. + type: Article + url: https://www.asyncapi.com/blog/transfergo-asyncapi-story kuehne: name: Kuehne+Nagel description: Implementing a GitOps-based pipeline to enable self-service management of Kafka infrastructure, including access control management. Automation of AsyncAPI document governance ensures consistency in the infrastructure at the pull request level. @@ -94,41 +94,41 @@ data: url: https://adidas.gitbook.io/api-guidelines/asynchronous-api-guidelines/kafka-asynchronous-guidelines/a_introduction/why-asyncapi morgan: name: Morgan Stanley - description: AsyncAPI is promoted not only inside the company but also as a standard for FinOS Foundation for managing architecture as code. + description: Used for sharing Websocket based APIs for discoverability and unified security. type: Slides url: https://drive.google.com/file/d/1YzLwQZsMUXGwj_Lsqv-ZnvV2knuowWrS/view?usp=drive_link schwarz: name: Schwarz Group - description: + description: TODO type: Video - url: + url: TODO adeo: name: Adeo - description: - type: Video - url: + description: Document the API of the product, so its users know how it works and how to use it. AsyncAPI was selected as the standard that allows you to generate documentation from a machine-readable document that describes the API. The goal was to document API in a standardized way, so other internal products could follow to unify how APIs are documented across the company. + type: Use Case + url: https://www.asyncapi.com/casestudies/adeogroup hdi: name: HDI Global SE - description: - type: Video - url: + description: The AsyncAPI documents are used for documentation purposes by the platform team. It provides a comprehensive overview of the asynchronous communication in our system, including the available topics and the structure of the messages. + type: Use Case + url: https://www.asyncapi.com/casestudies/hdiglobal sap: name: SAP - description: + description: Using AsyncAPI to deliver company wide event catalog for easier discoverability of events and event-driven APIs. type: Video - url: + url: TODO lombard: name: Lombard Odier - description: - type: Video - url: + description: Using AsyncAPI as contract for mocking and testing APIs and documentation. + type: Slides + url: https://www.slideshare.net/slideshow/apidays-paris-2022-adding-a-mock-as-a-service-capability-to-your-api-strategy-portfolio-ludovic-pourrat-lombard-odier/255041645#4 siemens: - name: Siemens - description: - type: Video - url: + name: Siemens AG + description: Using AsyncAPI to document their ROS2 interfaces. + type: Code + url: https://github.com/siemens/rosita pagopa: name: PagoPA - description: - type: Video - url: \ No newline at end of file + description: Using AsyncAPI for documentation purposes to help developers understand event-driven APIs. Using Springwolf project and generate AsyncAPI documents from code. + type: Code + url: https://github.com/pagopa/p4pa-registries/blob/develop/asyncapi/generated.asyncapi.json \ No newline at end of file From a11ba915cf8463969ba59e5ad47d879f845ecf63 Mon Sep 17 00:00:00 2001 From: Lukasz Gornicki Date: Thu, 23 Oct 2025 16:41:36 +0200 Subject: [PATCH 4/8] update ui and add dereferencing --- .gitignore | 2 +- config/usecases.yaml | 152 +++++++--- package-lock.json | 327 ++------------------- package.json | 1 + pages/casestudies/index.tsx | 32 +- scripts/adopters/index.ts | 20 -- scripts/helpers/readAndWriteJson.ts | 10 +- scripts/index.ts | 4 +- scripts/usecases/index.ts | 20 ++ tests/index.test.ts | 6 +- tests/{adopters => usecases}/index.test.ts | 8 +- 11 files changed, 183 insertions(+), 399 deletions(-) delete mode 100644 scripts/adopters/index.ts create mode 100644 scripts/usecases/index.ts rename tests/{adopters => usecases}/index.test.ts (71%) diff --git a/.gitignore b/.gitignore index fff5436fc984..17b8c74608ee 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,7 @@ node_modules out config/posts.json config/case-studies.json -config/adopters.json +config/usecases.json public/rss.xml .env.local yarn.lock diff --git a/config/usecases.yaml b/config/usecases.yaml index 2f6c054de2cb..1a11724e35a3 100644 --- a/config/usecases.yaml +++ b/config/usecases.yaml @@ -3,132 +3,196 @@ usecases: infraascode: title: Infrastructure as Code description: This makes them a great fit for Infrastructure as Code. DevOps teams can use AsyncAPI contracts to automatically provision topics, assign access rights, and configure brokers. Instead of manual setup, everything is declarative and repeatable. + inproduction: + - $ref: '#/data/raiffeisen' + - $ref: '#/data/kuehne' + - $ref: '#/data/lego1' + - $ref: '#/data/postman' + - $ref: '#/data/newzealand' + - $ref: '#/data/schwarz' testing: title: Testing and Mocking description: "You don’t need to wait for producers to deploy before you start building consumers. Once teams agree on the event structure, you can capture it in an AsyncAPI contract and generate mocks directly. This lets developers test consumers against simulated producers, speeding up development and avoiding bottlenecks." + inproduction: + - $ref: '#/data/transfergo' + - $ref: '#/data/lombard' docs: title: Developer Portal and Discoverability description: Generate documentation and share across entire organization which events exist, who produces them, who consumes them, and how traffic flows. This makes onboarding easier and promotes cross-team visibility. Identify what consumers will be affected by event changes introduced by producers. + inproduction: + - $ref: '#/data/lego1' + - $ref: '#/data/transfergo' + - $ref: '#/data/newzealand' + - $ref: '#/data/zora' + - $ref: '#/data/walmart' + - $ref: '#/data/hdi' + - $ref: '#/data/adidas' + - $ref: '#/data/sap' + - $ref: '#/data/ebay' + - $ref: '#/data/adeo' governance: title: Governance and Consistency description: Assure consistency across your event ecosystem. You can validate contracts to ensure topic names follow organizational standards, check that no sensitive information is exposed, and apply custom rules through linting. This builds governance into the development lifecycle without slowing teams down. + inproduction: + - $ref: '#/data/lego2' + - $ref: '#/data/ebay' + - $ref: '#/data/kuehne' + - $ref: '#/data/newzealand' + - $ref: '#/data/walmart' + - $ref: '#/data/ebay' + - $ref: '#/data/universitycatalonia' selfservice: title: Self-Service description: "Because AsyncAPI is machine-readable, it’s perfect for building self-service platforms. Teams can submit their contracts to a central service, which automatically validates schemas, publishes them to a shared registry, and provisions broker resources. This enables faster time-to-production while keeping standards and compliance intact." + inproduction: + - $ref: '#/data/lego1' + - $ref: '#/data/walmart' + - $ref: '#/data/newzealand' codegen: title: Code Generation description: AsyncAPI helps eliminate boilerplate code. You can start by generating strongly typed models from message schemas and go further by producing client libraries or even SDKs. This accelerates development, reduces human error, and ensures producers and consumers always stay aligned with the contract. + inproduction: + - $ref: '#/data/raiffeisen' + - $ref: '#/data/oracle' + - $ref: '#/data/adobe' + - $ref: '#/data/adidas' + - $ref: '#/data/universitycatalonia' + - $ref: '#/data/transfergo' extensibility: title: Extensibility - Quality of Service Monitoring description: AsyncAPI supports extensions, so you can enrich contracts with operational requirements like SLA or QoS details. For example, an IoT device might declare its expected latency or throughput. Monitoring tools can read these extensions, track service quality, and raise alerts when metrics fall below agreed levels. + inproduction: + - $ref: '#/data/universitycatalonia' data: raiffeisen: name: Raiffeisen Bank description: Implementing a Continuous Integration and Continuous Delivery (CI/CD) pipeline utilizing GitOps principles to deploy a topology constructed on AsyncAPI definitions using a Kubernetes operator to an Apache Pulsar cluster. - type: Video - url: https://www.youtube.com/watch?v=_MwzLZMwFN8 + resources: + - type: Video + url: https://www.youtube.com/watch?v=_MwzLZMwFN8 lego1: name: LEGO Group description: Managing brokers, where developers abstain from direct access to the management console and instead upload AsyncAPI documents to a self-service API, which provisions access and topics specified in the documents. - type: Video - url: https://www.youtube.com/watch?v=m8I0fYjx6Cc + resources: + - type: Video + url: https://www.youtube.com/watch?v=m8I0fYjx6Cc lego2: name: LEGO Group description: Defining, documenting, and distributing event-driven APIs while ensuring consistency and governance. - type: Video - url: https://www.youtube.com/watch?v=qjarcJQVLOg + resources: + - type: Video + url: https://www.youtube.com/watch?v=qjarcJQVLOg newzealand: name: Bank of New Zealand description: Establishing a decentralized company-wide governance strategy for APIs, providing a self-service platform for publishing APIs and documentation. - type: Video - url: https://www.confluent.io/events/kafka-summit-apac-2021/self-service-events-and-decentralised-governance-with-asyncapi-a-real-world/ + resources: + - type: Video + url: https://www.confluent.io/events/kafka-summit-apac-2021/self-service-events-and-decentralised-governance-with-asyncapi-a-real-world/ zora: name: Zora Robotics description: Documenting public MQTT APIs for IoT products and constructing a developer portal. - type: Video - url: https://www.youtube.com/watch?v=yjHgT0n2BtA + resources: + - type: Video + url: https://www.youtube.com/watch?v=yjHgT0n2BtA walmart: name: Walmart description: Managing a centralized API Hub for internal teams, enhancing event discoverability and visibility using AsyncAPI. AsyncAPI facilitates company-wide governance on asynchronous APIs. - type: Video - url: https://www.youtube.com/watch?v=SxTpGRaNIPo + resources: + - type: Video + url: https://www.youtube.com/watch?v=SxTpGRaNIPo ebay: name: eBay description: Facilitating partner integration with eBay through asynchronous communication, leveraging public AsyncAPI documents for code generation and rapid integration, while ensuring governance and standardization. - type: Video - url: https://www.youtube.com/watch?v=SxTpGRaNIPo + resources: + - type: Video + url: https://www.youtube.com/watch?v=SxTpGRaNIPo postman: name: Postman description: Enhancing discoverability of information about system events by building a tool called Synapse for provisioning entire event-based infrastructure, with AsyncAPI documents as the source of truth. - type: Video - url: https://www.youtube.com/watch?v=0_7QZyKLPoE + resources: + - type: Video + url: https://www.youtube.com/watch?v=0_7QZyKLPoE adobe: name: Adobe description: Providing event documentation to expedite development by generating classes based on message payload information from AsyncAPI documents. - type: Slides - url: https://drive.google.com/file/d/1AVCG9_fFtuOtrvZVZWENmU2aDT7C51Jr/view?usp=sharing + resources: + - type: Slides + url: https://drive.google.com/file/d/1AVCG9_fFtuOtrvZVZWENmU2aDT7C51Jr/view?usp=sharing universitycatalonia: name: Open University of Catalonia and Prodevelop description: Enabling monitoring of ports through a design-first approach, utilizing UML class diagrams to design the entire infrastructure. UML diagrams are source of truth for generated AsyncAPI documents that later are used for models and clients generation. These documents are extended with additional SLA properties to specify runtime quality of service requirements, facilitating real-time monitoring. - type: Video - url: https://www.youtube.com/watch?v=m4KS6FSeTT4 + resources: + - type: Video + url: https://www.youtube.com/watch?v=m4KS6FSeTT4 oracle: name: Oracle description: Documenting data streaming APIs with AsyncAPI documents for client library generation in various programming languages, reducing development time for applications consuming data. - type: Video - url: https://www.youtube.com/watch?v=CGLlxYy66LY + resources: + - type: Video + url: https://www.youtube.com/watch?v=CGLlxYy66LY transfergo: name: TransferGo description: TransferGo uses the AsyncAPI specification as the essential, standardized blueprint for their event-driven microservices, enabling automated documentation (Event Catalog), continuous validation, and reliable contract testing (Microcks) to ensure clarity and trust across their system. - type: Article - url: https://www.asyncapi.com/blog/transfergo-asyncapi-story + resources: + - type: Article + url: https://www.asyncapi.com/blog/transfergo-asyncapi-story kuehne: name: Kuehne+Nagel description: Implementing a GitOps-based pipeline to enable self-service management of Kafka infrastructure, including access control management. Automation of AsyncAPI document governance ensures consistency in the infrastructure at the pull request level. - type: Slides - url: https://drive.google.com/file/d/1y67PI8NaITPPwZAiDF2Zs7ISfcIpqMV8/view?usp=sharing + resources: + - type: Slides + url: https://drive.google.com/file/d/1y67PI8NaITPPwZAiDF2Zs7ISfcIpqMV8/view?usp=sharing adidas: name: Adidas description: AsyncAPI is a standard for defining asynchronous APIs using Apache Kafka. AsyncAPI governed under official guidelines. AsyncAPI is promoted to be used for documentation and code generation. - type: Docs - url: https://adidas.gitbook.io/api-guidelines/asynchronous-api-guidelines/kafka-asynchronous-guidelines/a_introduction/why-asyncapi + resources: + - type: Docs + url: https://adidas.gitbook.io/api-guidelines/asynchronous-api-guidelines/kafka-asynchronous-guidelines/a_introduction/why-asyncapi morgan: name: Morgan Stanley description: Used for sharing Websocket based APIs for discoverability and unified security. - type: Slides - url: https://drive.google.com/file/d/1YzLwQZsMUXGwj_Lsqv-ZnvV2knuowWrS/view?usp=drive_link + resources: + - type: Slides + url: https://drive.google.com/file/d/1YzLwQZsMUXGwj_Lsqv-ZnvV2knuowWrS/view?usp=drive_link schwarz: name: Schwarz Group description: TODO - type: Video - url: TODO + resources: + - type: Video + url: TODO adeo: name: Adeo description: Document the API of the product, so its users know how it works and how to use it. AsyncAPI was selected as the standard that allows you to generate documentation from a machine-readable document that describes the API. The goal was to document API in a standardized way, so other internal products could follow to unify how APIs are documented across the company. - type: Use Case - url: https://www.asyncapi.com/casestudies/adeogroup + resources: + - type: Use Case + url: https://www.asyncapi.com/casestudies/adeogroup hdi: name: HDI Global SE description: The AsyncAPI documents are used for documentation purposes by the platform team. It provides a comprehensive overview of the asynchronous communication in our system, including the available topics and the structure of the messages. - type: Use Case - url: https://www.asyncapi.com/casestudies/hdiglobal + resources: + - type: Use Case + url: https://www.asyncapi.com/casestudies/hdiglobal sap: name: SAP description: Using AsyncAPI to deliver company wide event catalog for easier discoverability of events and event-driven APIs. - type: Video - url: TODO + resources: + - type: Video + url: https://www.youtube.com/watch?v=KcYiD67gEh0&list=PLbi1gRlP7pig_nA0tRlr0hU_h5sB2HXcq&index=6 lombard: name: Lombard Odier description: Using AsyncAPI as contract for mocking and testing APIs and documentation. - type: Slides - url: https://www.slideshare.net/slideshow/apidays-paris-2022-adding-a-mock-as-a-service-capability-to-your-api-strategy-portfolio-ludovic-pourrat-lombard-odier/255041645#4 + resources: + - type: Slides + url: https://www.slideshare.net/slideshow/apidays-paris-2022-adding-a-mock-as-a-service-capability-to-your-api-strategy-portfolio-ludovic-pourrat-lombard-odier/255041645#4 siemens: name: Siemens AG description: Using AsyncAPI to document their ROS2 interfaces. - type: Code - url: https://github.com/siemens/rosita + resources: + - type: Code + url: https://github.com/siemens/rosita pagopa: name: PagoPA description: Using AsyncAPI for documentation purposes to help developers understand event-driven APIs. Using Springwolf project and generate AsyncAPI documents from code. - type: Code - url: https://github.com/pagopa/p4pa-registries/blob/develop/asyncapi/generated.asyncapi.json \ No newline at end of file + resources: + - type: Code + url: https://github.com/pagopa/p4pa-registries/blob/develop/asyncapi/generated.asyncapi.json \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 29ab1ce76688..b8cafb3e2a03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -85,6 +85,7 @@ "yaml": "^2.3.4" }, "devDependencies": { + "@apidevtools/json-schema-ref-parser": "^14.2.1", "@babel/preset-typescript": "^7.26.0", "@chromatic-com/storybook": "^1.6.1", "@netlify/functions": "^2.6.0", @@ -338,6 +339,25 @@ "node": ">=6.0.0" } }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-14.2.1.tgz", + "integrity": "sha512-HmdFw9CDYqM6B25pqGBpNeLCKvGPlIx1EbLrVL0zPvj50CJQUHyBNBw45Muk0kEIkogo1VZvOKHajdMuAzSxRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 20" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + }, + "peerDependencies": { + "@types/json-schema": "^7.0.15" + } + }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", @@ -7333,35 +7353,6 @@ } } }, - "node_modules/@storybook/preset-react-webpack/node_modules/@adobe/css-tools": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.3.tgz", - "integrity": "sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/instrumenter": { - "version": "8.6.14", - "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.6.14.tgz", - "integrity": "sha512-iG4MlWCcz1L7Yu8AwgsnfVAmMbvyRSk700Mfy2g4c8y5O+Cv1ejshE1LBBsCwHgkuqU0H4R0qu4g23+6UnUemQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@storybook/global": "^5.0.0", - "@vitest/utils": "^2.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.6.14" - } - }, "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/react": { "version": "8.6.14", "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.6.14.tgz", @@ -7415,272 +7406,6 @@ "storybook": "^8.6.14" } }, - "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/test": { - "version": "8.6.14", - "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.6.14.tgz", - "integrity": "sha512-GkPNBbbZmz+XRdrhMtkxPotCLOQ1BaGNp/gFZYdGDk2KmUWBKmvc5JxxOhtoXM2703IzNFlQHSSNnhrDZYuLlw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@storybook/global": "^5.0.0", - "@storybook/instrumenter": "8.6.14", - "@testing-library/dom": "10.4.0", - "@testing-library/jest-dom": "6.5.0", - "@testing-library/user-event": "14.5.2", - "@vitest/expect": "2.0.5", - "@vitest/spy": "2.0.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.6.14" - } - }, - "node_modules/@storybook/preset-react-webpack/node_modules/@testing-library/dom": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@storybook/preset-react-webpack/node_modules/@testing-library/jest-dom": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz", - "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@adobe/css-tools": "^4.4.0", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "lodash": "^4.17.21", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/@storybook/preset-react-webpack/node_modules/@testing-library/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/preset-react-webpack/node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@storybook/preset-react-webpack/node_modules/@vitest/expect": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", - "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", - "chai": "^5.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@storybook/preset-react-webpack/node_modules/@vitest/expect/node_modules/@vitest/pretty-format": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", - "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@storybook/preset-react-webpack/node_modules/@vitest/expect/node_modules/@vitest/utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", - "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vitest/pretty-format": "2.0.5", - "estree-walker": "^3.0.3", - "loupe": "^3.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@storybook/preset-react-webpack/node_modules/@vitest/spy": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", - "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "tinyspy": "^3.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@storybook/preset-react-webpack/node_modules/@vitest/utils": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", - "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vitest/pretty-format": "2.1.9", - "loupe": "^3.1.2", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@storybook/preset-react-webpack/node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/preset-react-webpack/node_modules/chai": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", - "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/preset-react-webpack/node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 16" - } - }, - "node_modules/@storybook/preset-react-webpack/node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/preset-react-webpack/node_modules/loupe": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", - "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@storybook/preset-react-webpack/node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/@storybook/preset-react-webpack/node_modules/tinyspy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@storybook/preview-api": { "version": "8.6.14", "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.6.14.tgz", @@ -8310,18 +8035,6 @@ "integrity": "sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==", "dev": true }, - "node_modules/@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", diff --git a/package.json b/package.json index 0d6752d9da63..b1d0b330ebc0 100644 --- a/package.json +++ b/package.json @@ -123,6 +123,7 @@ "yaml": "^2.3.4" }, "devDependencies": { + "@apidevtools/json-schema-ref-parser": "^14.2.1", "@babel/preset-typescript": "^7.26.0", "@chromatic-com/storybook": "^1.6.1", "@netlify/functions": "^2.6.0", diff --git a/pages/casestudies/index.tsx b/pages/casestudies/index.tsx index 1a67451dabef..efb19c392472 100644 --- a/pages/casestudies/index.tsx +++ b/pages/casestudies/index.tsx @@ -9,17 +9,17 @@ import GenericLayout from '../../components/layout/GenericLayout'; import Heading from '../../components/typography/Heading'; import Paragraph from '../../components/typography/Paragraph'; import TextLink from '../../components/typography/TextLink'; -import AdoptersList from '../../config/adopters.json'; +import UsecasesList from '../../config/usecases.json'; import CaseStudiesList from '../../config/case-studies.json'; interface Resource { - title: string; - link: string; + type: string; + url: string; } interface Adopter { - companyName: string; - useCase: string; + name: string; + description: string; resources: Resource[]; } @@ -31,6 +31,8 @@ export default function Casestudies() { const image: string = '/img/social/case-studies.webp'; const title: string = 'Case Studies'; + const AdoptersList = Object.values(UsecasesList.data) as Adopter[]; + return (
- Check out how different companies use AsyncAPI and what problems they solve. + {UsecasesList.description} Feel free to{' '} - + submit a pull request {' '} with information about how your company uses AsyncAPI. We know that writing an official case study might @@ -95,14 +97,14 @@ export default function Casestudies() { {AdoptersList.map((entry: Adopter, index: number) => ( - {entry.companyName} - {entry.useCase} + {entry.name} + {entry.description}
    {entry.resources.map((resource: Resource, resourceIndex: number) => (
  • - - {resource.title} + + {resource.type}
  • ))} @@ -123,19 +125,19 @@ export default function Casestudies() { data-testid='Adopters' >
    -

    {entry.companyName}

    +

    {entry.name}

    Use Case:

    -

    {entry.useCase}

    +

    {entry.description}

    Resources:

      {entry.resources.map((resource: Resource, resourceIndex: number) => (
    • - - {resource.title} + + {resource.type}
    • ))} diff --git a/scripts/adopters/index.ts b/scripts/adopters/index.ts deleted file mode 100644 index fc7b652591d7..000000000000 --- a/scripts/adopters/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { dirname, resolve } from 'path'; -import { fileURLToPath } from 'url'; - -import { writeJSON } from '../helpers/readAndWriteJson'; - -const currentFilePath = fileURLToPath(import.meta.url); -const currentDirPath = dirname(currentFilePath); - -/** - * Converts the YAML adopters configuration to a JSON file. - * - * This asynchronous function reads the adopters configuration from - * "config/adopters.yml" and converts its content to JSON format. It then writes - * the resulting JSON data to "adopters.json" in the configuration directory determined - * by resolving the current file's directory with "../../config". The operation is - * performed using the writeJSON utility. - */ -export async function buildAdoptersList() { - writeJSON('config/adopters.yml', resolve(currentDirPath, '../../config', 'adopters.json')); -} diff --git a/scripts/helpers/readAndWriteJson.ts b/scripts/helpers/readAndWriteJson.ts index d0b975edb2a9..443ab2daa43a 100644 --- a/scripts/helpers/readAndWriteJson.ts +++ b/scripts/helpers/readAndWriteJson.ts @@ -1,5 +1,5 @@ import { readFile, writeFile } from 'fs/promises'; - +import $RefParser from '@apidevtools/json-schema-ref-parser'; import { convertToJson } from './utils'; /** @@ -9,9 +9,11 @@ import { convertToJson } from './utils'; * * @param readPath - The file path from which to read the content. * @param writePath - The file path where the JSON output will be written. + * @param dereference - A boolean flag indicating whether to dereference JSON references ($ref). + * @returns A promise that resolves when the JSON file has been successfully written. * @throws {Error} If reading the file, converting its content to JSON, or writing the JSON output fails. */ -export async function writeJSON(readPath: string, writePath: string) { +export async function writeJSON(readPath: string, writePath: string, dereference: boolean = false): Promise { let readContent; let jsonContent; @@ -29,9 +31,11 @@ export async function writeJSON(readPath: string, writePath: string) { return Promise.reject(err); } + const dereferenced = await $RefParser.dereference(jsonContent); + // Attempt to write the JSON content to file try { - await writeFile(writePath, JSON.stringify(jsonContent)); + await writeFile(writePath, JSON.stringify(dereferenced)); } catch (err) { return Promise.reject(err); } diff --git a/scripts/index.ts b/scripts/index.ts index f135b9ca9249..898f83029381 100644 --- a/scripts/index.ts +++ b/scripts/index.ts @@ -2,7 +2,7 @@ import fs from 'fs'; import { dirname, resolve } from 'path'; import { fileURLToPath } from 'url'; -import { buildAdoptersList } from './adopters/index'; +import { buildUsecasesList } from './usecases/index'; import { buildPostList } from './build-post-list'; import { rssFeed } from './build-rss'; import { buildCaseStudiesList } from './casestudies/index'; @@ -33,7 +33,7 @@ async function start() { await buildPostList(postDirectories, basePath, writeFilePath); await rssFeed('blog', 'AsyncAPI Initiative Blog RSS Feed', 'AsyncAPI Initiative Blog', 'rss.xml'); await buildCaseStudiesList('config/casestudies', resolve(currentDirPath, '../config', 'case-studies.json')); - await buildAdoptersList(); + await buildUsecasesList(); const financeDir = resolve('.', 'config', 'finance'); // loop through all the files finance in directory and find the latest year to build the finance info list diff --git a/scripts/usecases/index.ts b/scripts/usecases/index.ts new file mode 100644 index 000000000000..f1120fff400d --- /dev/null +++ b/scripts/usecases/index.ts @@ -0,0 +1,20 @@ +import { dirname, resolve } from 'path'; +import { fileURLToPath } from 'url'; + +import { writeJSON } from '../helpers/readAndWriteJson'; + +const currentFilePath = fileURLToPath(import.meta.url); +const currentDirPath = dirname(currentFilePath); + +/** + * Converts the YAML usecases configuration to a JSON file. + * + * This asynchronous function reads the usecases configuration from + * "config/usecases.yaml" and converts its content to JSON format. It then writes + * the resulting JSON data to "usecases.json" in the configuration directory determined + * by resolving the current file's directory with "../../config". The operation is + * performed using the writeJSON utility. + */ +export async function buildUsecasesList() { + await writeJSON('config/usecases.yaml', resolve(currentDirPath, '../../config', 'usecases.json'), true); +} diff --git a/tests/index.test.ts b/tests/index.test.ts index ab8806fdc70e..1dba86ccc4c1 100644 --- a/tests/index.test.ts +++ b/tests/index.test.ts @@ -1,6 +1,6 @@ import fs from 'fs'; -import { buildAdoptersList } from '../scripts/adopters/index'; +import { buildUsecasesList } from '../scripts/usecases/index'; import { buildPostList } from '../scripts/build-post-list'; import { rssFeed } from '../scripts/build-rss'; import { buildCaseStudiesList } from '../scripts/casestudies/index'; @@ -10,7 +10,7 @@ import { start } from '../scripts/index'; jest.mock('../scripts/build-rss'); jest.mock('../scripts/build-post-list'); jest.mock('../scripts/casestudies'); -jest.mock('../scripts/adopters'); +jest.mock('../scripts/usecases'); jest.mock('../scripts/finance'); describe('start function', () => { @@ -31,7 +31,7 @@ describe('start function', () => { ); expect(buildCaseStudiesList).toHaveBeenCalled(); - expect(buildAdoptersList).toHaveBeenCalled(); + expect(buildUsecasesList).toHaveBeenCalled(); expect(buildFinanceInfoList).toHaveBeenCalled(); }); diff --git a/tests/adopters/index.test.ts b/tests/usecases/index.test.ts similarity index 71% rename from tests/adopters/index.test.ts rename to tests/usecases/index.test.ts index 1e504d48526f..eab3aafd829a 100644 --- a/tests/adopters/index.test.ts +++ b/tests/usecases/index.test.ts @@ -1,16 +1,16 @@ import { resolve } from 'path'; -import { buildAdoptersList } from '../../scripts/adopters/index'; +import { buildUsecasesList } from '../../scripts/usecases/index'; import { writeJSON } from '../../scripts/helpers/readAndWriteJson'; jest.mock('../../scripts/helpers/readAndWriteJson.ts'); describe('buildAdoptersList', () => { test('should call writeJSON with correct arguments', async () => { - const expectedReadPath = 'config/adopters.yml'; - const expectedWritePath = resolve(__dirname, '../../config', 'adopters.json'); + const expectedReadPath = 'config/usecases.yaml'; + const expectedWritePath = resolve(__dirname, '../../config', 'usecases.json'); - await buildAdoptersList(); + await buildUsecasesList(); expect(writeJSON).toHaveBeenCalledWith(expectedReadPath, expectedWritePath); }); From 47b6ab3fa8b9cd992ce8c0bd9970297097fb57ca Mon Sep 17 00:00:00 2001 From: Lukasz Gornicki Date: Thu, 23 Oct 2025 17:43:42 +0200 Subject: [PATCH 5/8] text improvements --- config/usecases.yaml | 14 +- package-lock.json | 276 ++++++++++++++++++++++++++++++++++++ pages/casestudies/index.tsx | 6 +- 3 files changed, 286 insertions(+), 10 deletions(-) diff --git a/config/usecases.yaml b/config/usecases.yaml index 1a11724e35a3..25ea9cfc951a 100644 --- a/config/usecases.yaml +++ b/config/usecases.yaml @@ -1,4 +1,4 @@ -description: "All use cases related to AsyncAPI collectively contribute to most important aspect of software development, which is costs reduction. For example with `Infrastructure as Code` instead of enabling costly on-demand topic provisioning in your broker, you can automate it safely using AsyncAPI contracts. Before you provision new topics, you can first validate if it this is not causing duplicates and unnecessary costs increase. Use case like `Governance and Consistency` or `Developer Portal` significantly contributes to adoption of events infrastructure in consistent way and makes onboarding faster, that directly converts to cost reduction." +description: "All use cases related to AsyncAPI collectively contribute to most important aspect of software development, which is costs reduction. For example with \"Infrastructure as Code\" instead of enabling costly on-demand topic provisioning in your broker, you can automate it safely using AsyncAPI contracts. Before you provision new topics, you can first validate if it this is not causing duplicates and unnecessary costs increase. Use case like \"Governance and Consistency\" or \"Developer Portal\" significantly contributes to adoption of events infrastructure in consistent way and makes onboarding faster, that directly converts to cost reduction." usecases: infraascode: title: Infrastructure as Code @@ -154,12 +154,12 @@ data: resources: - type: Slides url: https://drive.google.com/file/d/1YzLwQZsMUXGwj_Lsqv-ZnvV2knuowWrS/view?usp=drive_link - schwarz: - name: Schwarz Group - description: TODO - resources: - - type: Video - url: TODO + # schwarz: + # name: Schwarz Group + # description: TODO + # resources: + # - type: Video + # url: TODO adeo: name: Adeo description: Document the API of the product, so its users know how it works and how to use it. AsyncAPI was selected as the standard that allows you to generate documentation from a machine-readable document that describes the API. The goal was to document API in a standardized way, so other internal products could follow to unify how APIs are documented across the company. diff --git a/package-lock.json b/package-lock.json index b8cafb3e2a03..4c6a098f5747 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7353,6 +7353,33 @@ } } }, + "node_modules/@storybook/preset-react-webpack/node_modules/@adobe/css-tools": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/instrumenter": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.6.14.tgz", + "integrity": "sha512-iG4MlWCcz1L7Yu8AwgsnfVAmMbvyRSk700Mfy2g4c8y5O+Cv1ejshE1LBBsCwHgkuqU0H4R0qu4g23+6UnUemQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@storybook/global": "^5.0.0", + "@vitest/utils": "^2.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/react": { "version": "8.6.14", "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.6.14.tgz", @@ -7406,6 +7433,255 @@ "storybook": "^8.6.14" } }, + "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/test": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.6.14.tgz", + "integrity": "sha512-GkPNBbbZmz+XRdrhMtkxPotCLOQ1BaGNp/gFZYdGDk2KmUWBKmvc5JxxOhtoXM2703IzNFlQHSSNnhrDZYuLlw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@storybook/global": "^5.0.0", + "@storybook/instrumenter": "8.6.14", + "@testing-library/dom": "10.4.0", + "@testing-library/jest-dom": "6.5.0", + "@testing-library/user-event": "14.5.2", + "@vitest/expect": "2.0.5", + "@vitest/spy": "2.0.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/@testing-library/jest-dom": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz", + "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.21", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@storybook/preset-react-webpack/node_modules/@vitest/expect": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", + "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/@vitest/expect/node_modules/@vitest/pretty-format": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", + "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/@vitest/expect/node_modules/@vitest/utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", + "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@vitest/pretty-format": "2.0.5", + "estree-walker": "^3.0.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/@vitest/spy": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", + "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/@vitest/utils": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", + "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/chai": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 16" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@storybook/preset-react-webpack/node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@storybook/preview-api": { "version": "8.6.14", "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.6.14.tgz", diff --git a/pages/casestudies/index.tsx b/pages/casestudies/index.tsx index efb19c392472..a5864166e334 100644 --- a/pages/casestudies/index.tsx +++ b/pages/casestudies/index.tsx @@ -68,9 +68,6 @@ export default function Casestudies() { Adopters - - {UsecasesList.description} - Feel free to{' '} @@ -80,6 +77,9 @@ export default function Casestudies() { be time consuming and requires too much internal paper work. Let's make sure we can at least capture a use case that is already a great learning information for the community. + + {UsecasesList.description} +
From db97d91664b5188731b988fe6aca1abaf4242851 Mon Sep 17 00:00:00 2001 From: Lukasz Gornicki Date: Thu, 23 Oct 2025 17:58:40 +0200 Subject: [PATCH 6/8] fix build --- config/usecases.yaml | 3 +-- pages/casestudies/index.tsx | 2 +- tests/usecases/index.test.ts | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/config/usecases.yaml b/config/usecases.yaml index 25ea9cfc951a..a0d52bf8cdf2 100644 --- a/config/usecases.yaml +++ b/config/usecases.yaml @@ -9,7 +9,7 @@ usecases: - $ref: '#/data/lego1' - $ref: '#/data/postman' - $ref: '#/data/newzealand' - - $ref: '#/data/schwarz' + # - $ref: '#/data/schwarz' testing: title: Testing and Mocking description: "You don’t need to wait for producers to deploy before you start building consumers. Once teams agree on the event structure, you can capture it in an AsyncAPI contract and generate mocks directly. This lets developers test consumers against simulated producers, speeding up development and avoiding bottlenecks." @@ -35,7 +35,6 @@ usecases: description: Assure consistency across your event ecosystem. You can validate contracts to ensure topic names follow organizational standards, check that no sensitive information is exposed, and apply custom rules through linting. This builds governance into the development lifecycle without slowing teams down. inproduction: - $ref: '#/data/lego2' - - $ref: '#/data/ebay' - $ref: '#/data/kuehne' - $ref: '#/data/newzealand' - $ref: '#/data/walmart' diff --git a/pages/casestudies/index.tsx b/pages/casestudies/index.tsx index a5864166e334..f8827ff74838 100644 --- a/pages/casestudies/index.tsx +++ b/pages/casestudies/index.tsx @@ -70,7 +70,7 @@ export default function Casestudies() { Feel free to{' '} - + submit a pull request {' '} with information about how your company uses AsyncAPI. We know that writing an official case study might diff --git a/tests/usecases/index.test.ts b/tests/usecases/index.test.ts index eab3aafd829a..bb6bc71b4882 100644 --- a/tests/usecases/index.test.ts +++ b/tests/usecases/index.test.ts @@ -12,6 +12,6 @@ describe('buildAdoptersList', () => { await buildUsecasesList(); - expect(writeJSON).toHaveBeenCalledWith(expectedReadPath, expectedWritePath); + expect(writeJSON).toHaveBeenCalledWith(expectedReadPath, expectedWritePath, true); }); }); From d2e56c5446a0f7d03ccb49d06dfc5d5d65dc1254 Mon Sep 17 00:00:00 2001 From: Lukasz Gornicki Date: Thu, 23 Oct 2025 18:09:05 +0200 Subject: [PATCH 7/8] Update index.tsx --- pages/casestudies/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/casestudies/index.tsx b/pages/casestudies/index.tsx index f8827ff74838..dace5cb0423f 100644 --- a/pages/casestudies/index.tsx +++ b/pages/casestudies/index.tsx @@ -9,8 +9,8 @@ import GenericLayout from '../../components/layout/GenericLayout'; import Heading from '../../components/typography/Heading'; import Paragraph from '../../components/typography/Paragraph'; import TextLink from '../../components/typography/TextLink'; -import UsecasesList from '../../config/usecases.json'; import CaseStudiesList from '../../config/case-studies.json'; +import UsecasesList from '../../config/usecases.json'; interface Resource { type: string; From 023e0779c2d75b28838155af10c23076ad2aa069 Mon Sep 17 00:00:00 2001 From: Lukasz Gornicki Date: Thu, 23 Oct 2025 18:13:19 +0200 Subject: [PATCH 8/8] Update tests/usecases/index.test.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- tests/usecases/index.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/usecases/index.test.ts b/tests/usecases/index.test.ts index bb6bc71b4882..5a9d5569b2fc 100644 --- a/tests/usecases/index.test.ts +++ b/tests/usecases/index.test.ts @@ -5,7 +5,7 @@ import { writeJSON } from '../../scripts/helpers/readAndWriteJson'; jest.mock('../../scripts/helpers/readAndWriteJson.ts'); -describe('buildAdoptersList', () => { +describe('buildUsecasesList', () => { test('should call writeJSON with correct arguments', async () => { const expectedReadPath = 'config/usecases.yaml'; const expectedWritePath = resolve(__dirname, '../../config', 'usecases.json');