Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/zenwave360/zenwave-sdk

DDD and API-First tools for Event-Driven microservices. Create Software Easy to Understand.
https://github.com/zenwave360/zenwave-sdk

api-first asyncapi code-generator ddd jdl jhipster openapi

Last synced: 2 months ago
JSON representation

DDD and API-First tools for Event-Driven microservices. Create Software Easy to Understand.

Awesome Lists containing this project

README

        

# ZenWave SDK


ZW> Code Generator
ZW> Code Generator

> 👉 ZenWave360 Helps You Create Software Easy to Understand

[![Maven Central](https://img.shields.io/maven-central/v/io.github.zenwave360.zenwave-sdk/zenwave-sdk.svg?label=Maven%20Central&logo=apachemaven)](https://search.maven.org/artifact/io.github.zenwave360.zenwave-sdk/zenwave-sdk)
[![GitHub release (latest by date)](https://img.shields.io/github/v/release/ZenWave360/zenwave-sdk?logo=GitHub)](https://github.com/ZenWave360/zenwave-sdk/releases)
![General Availability](https://img.shields.io/badge/lifecycle-GA-green)
[![build](https://github.com/ZenWave360/zenwave-sdk/workflows/Build/badge.svg)](https://github.com/ZenWave360/zenwave-sdk/actions/workflows/build.yml)
[![coverage](https://raw.githubusercontent.com/ZenWave360/zenwave-sdk/badges/jacoco.svg)](https://github.com/ZenWave360/zenwave-sdk/actions/workflows/publish-maven-central.yml)
[![branches coverage](https://raw.githubusercontent.com/ZenWave360/zenwave-sdk/badges/branches.svg)](https://github.com/ZenWave360/zenwave-sdk/actions/workflows/publish-maven-central.yml)
[![GitHub](https://img.shields.io/github/license/ZenWave360/zenwave-sdk)](https://github.com/ZenWave360/zenwave-sdk/blob/main/LICENSE)

ZenWave SDK is a configurable and extensible toolkit for **Domain Driven Design (DDD)** and **API-First** that can generate code from a mix of different models including:

- ZDL Domain Language
- AsyncAPI
- OpenAPI

**Table of Contents:**

- [ZenWave SDK](#zenwave-sdk)
- [Jbang Instalation](#jbang-instalation)
- [Features / Roadmap](#features--roadmap)
- [Building from source](#building-from-source)
- [Usage](#usage)
- [Available Plugins](#available-plugins)
- [Forking an Standard or Custom Plugin](#forking-an-standard-or-custom-plugin)
- [ZenWave SDK Documentation](#zenwave-sdk-documentation)

## JBang Instalation

The easiest way to install ZenWave SDK is as a [JBang alias](https://www.jbang.dev/documentation/guide/latest/alias_catalogs.html):

```shell
jbang alias add --fresh --force --name=zw release@zenwave360/zenwave-sdk
```

or if you prefer to use the latest **snapshot** versions:

```shell
jbang alias add --fresh --force --name=zw snapshots@zenwave360/zenwave-sdk
```

or if you prefer to use the _next_ experimental/unstable **snapshot** versions:

```shell
jbang alias add --fresh --force --name=zw next@zenwave360/zenwave-sdk
```

If you plan to use **custom plugins** you will need to use the command in the following format:

```shell
jbang alias add --name=zw --force \
-m=io.zenwave360.sdk.Main \
--repos=mavencentral,snapshots=https://s01.oss.sonatype.org/content/repositories/snapshots \
--deps=\
org.slf4j:slf4j-simple:1.7.36,\
io.github.zenwave360.zenwave-sdk.plugins:asyncapi-spring-cloud-streams3:1.4.0,\
io.github.zenwave360.zenwave-sdk.plugins:asyncapi-jsonschema2pojo:1.4.0,\
io.github.zenwave360.zenwave-sdk.plugins:openapi-spring-webtestclient:1.4.0,\
io.github.zenwave360.zenwave-sdk.plugins:backend-application-default:1.4.0,\
io.github.zenwave360.zenwave-sdk.plugins:zdl-to-openapi:1.4.0,\
io.github.zenwave360.zenwave-sdk.plugins:zdl-to-asyncapi:1.4.0,\
io.github.zenwave360.zenwave-sdk.plugins:jdl-to-asyncapi:1.4.0,\
io.github.zenwave360.zenwave-sdk.plugins:zdl-to-markdown:1.4.0,\
io.github.zenwave360.zenwave-sdk.plugins:openapi-controllers:1.4.0
io.github.zenwave360.zenwave-sdk:zenwave-sdk-cli:1.4.0
```

You can include any **custom plugin** jars in the `--deps` option.

JBang will use you maven settings for repository resolution, but you can also specify a custom maven repository in the `--repos` option.

## Features / Roadmap

- [x] ZenWave SDK CLI
- [x] Default parsers, processors, plugins, templating, formatters, writers, etc... for AsyncAPI, OpenAPI and JDL.
- [x] Help command: detailed, json, markdown, list of available plugins
- [x] Fork existing (custom or standard) plugin command
- [x] ZenWave SDK Maven Plugin
- [x] Standard Plugins
- [x] JDL Backend Application (flexible hexagonal architecture)
- [x] Domain Entities
- [x] Inbound
- [x] Service Ports, DTOs, Mappers
- [x] Implementation for CRUD operations
- [x] Acceptance Tests: SpringData InMemory Repositories
- [x] Outbound: SpringData Repositories, ElasticSearch... (for REST or Async see other plugins)
- [x] Adapters:
- [x] Spring MVC
- [ ] ~~Spring WebFlux~~
- [ ] Flavors
- [x] MongoDB
- [x] Imperative
- [ ] ~~Reactive~~
- [x] JPA
- [x] Imperative
- [ ] ~~Reactive~~
- [x] Unit/Integration Testing
- [x] Edge Integration Testing: partial spring-boot context for outbound adapters (with testcontainers)
- [x] Sociable Vertical Testing: manual dependency setup with in memory infrastructure _test-doubles_
- [x] Vertical Integration Testing: full spring-boot context for inbound adapters (with testcontainers)
- [x] JDL OpenAPI Controllers
- [x] OpenAPI to Spring WebTestClient
- [x] AsyncAPI Spring Cloud Streams3
- [x] Consumer and Producer. Imperative and Reactive.
- [x] Business Exceptions Dead Letter Queues Routing
- [x] Producer with Transactional Outbox pattern
- [x] For MongoDB
- [x] For JDBC
- [x] Enterprise Envelop Pattern
- [x] Automatically fill headers at runtime from payload paths, tracing-id supplier...
- [x] JDL to Specs
- [x] JDL to OpenAPI
- [x] JDL to AsyncAPI
- [x] AsyncAPI schemas
- [x] AVRO schemas
- [x] API Testing
- [x] KarateDSL
- [x] OpenAPI to Karate E2E Tests (please use [KarateIDE VSCode Extension](https://github.com/ZenWave360/karate-ide) instead)
- [x] OpenAPI to Karate/ApiMock Stateful Mocks (please use [KarateIDE VSCode Extension](https://github.com/ZenWave360/karate-ide) and [ZenWave ApiMock](https://github.com/ZenWave360/zenwave-apimock) instead)
- [x] OpenAPI to Spring WebTestClient
- [x] OpenAPI to REST-assured
- [ ] ~~OpenAPI to Pact (_postponed sine die_)~~
- [x] Reverser Engineering
- [x] OpenAPI 2 JDL
- [x] Java 2 JDL
- [x] Spring Data MongoDB annotations
- [x] JPA annotations

## Building from source

```shell
git clone https://github.com/ZenWave360/zenwave-sdk.git
cd zenwave-sdk
mvn clean install
```

## Usage

Use the following jbang format:

```shell
jbang zw -p optionName=value optionName2=value
```

You can get a list of all available plugins:

```shell
$ jbang zw -h list
INFO Reflections - Reflections took 461 ms to scan 56 urls, producing 2393 keys and 11675 values
ZW> SDK (1.4.0)

Available plugins:

backend-application-default io.zenwave360.sdk.plugins.BackendApplicationDefaultPlugin: Generates a full backend application using a flexible hexagonal architecture (1.4.0)
spring-cloud-streams3-adapters io.zenwave360.sdk.plugins.SpringCloudStreams3AdaptersPlugin: Generates tests for Spring Cloud Streams Consumers. (1.4.0)
jdl-to-asyncapi io.zenwave360.sdk.plugins.JDLToAsyncAPIPlugin: Generates a full AsyncAPI definitions for CRUD operations from JDL models (1.4.0)
spring-webtestclient io.zenwave360.sdk.plugins.SpringWebTestClientPlugin: Generates test for SpringMVC or Spring WebFlux using WebTestClient based on OpenAPI specification. (1.4.0)
fork-plugin io.zenwave360.sdk.plugins.ForkPlugin: Creates a new standalone maven module cloning an existing plugin (1.4.0)
jsonschema2pojo io.zenwave360.sdk.plugins.AsyncApiJsonSchema2PojoPlugin: Generate Plain Old Java Objects from OpenAPI/AsyncAPI schemas or full JSON-Schema files (1.4.0)
openapi-controllers io.zenwave360.sdk.plugins.OpenAPIControllersPlugin: Generates implementations based on ZDL models and OpenAPI definitions SpringMVC generated OpenAPI interfaces. (1.4.0)
openapi-to-jdl io.zenwave360.sdk.plugins.OpenAPIToJDLPlugin: Generates JDL model from OpenAPI schemas (1.4.0)
spring-cloud-streams3 io.zenwave360.sdk.plugins.SpringCloudStreams3Plugin: Generates strongly typed SpringCloudStreams3 producer/consumer classes for AsyncAPI (1.4.0)
zdl-to-openapi io.zenwave360.sdk.plugins.ZDLToOpenAPIPlugin: Generates a draft OpenAPI definitions from your ZDL entities and services. (1.4.0)
zdl-to-markdown io.zenwave360.sdk.plugins.ZdlToMarkdownPlugin: Generates Markdown glossary from Zdl Models (1.4.0)
zdl-to-asyncapi io.zenwave360.sdk.plugins.ZDLToAsyncAPIPlugin: Generates a draft AsyncAPI file with events from your ZDL services. (1.4.0)
```

NOTE: it will list any available plugin, standard or custom, inside any of these root java packages "io", "com" or "org".

And get help for a given plugin:

```shell
jbang zw --help -p
```

You can add choose a help format from the following: help, detailed, markdown, or list:

```shell
jbang zw --help markdown -p
```

## Available Plugins

Refer to individual plugin's documentation for more information:

| **Plugin** | **Description** | **Model Types** |
|------------------------------------------------------------------------------------------|------------------------------------|----------------------------|
| [Backend Application Default](./plugins/backend-application-default/README.md) | Backend Application Default | ZDL |
| [AsyncAPI JSON Schema to POJO](./plugins/asyncapi-jsonschema2pojo/README.md) | AsyncAPI JSON Schema to POJO | AsyncAPI, JsonSchema |
| [AsyncAPI to Spring Cloud Streams 3](./plugins/asyncapi-spring-cloud-streams3/README.md) | AsyncAPI to Spring Cloud Streams 3 | AsyncAPI, AVRO, JsonSchema |
| [OpenAPI Controllers](./plugins/openapi-controllers/README.md) | JDL OpenAPI Controllers | OpenAPI, ZDL |
| [OpenAPI to Spring WebTestClient](./plugins/openapi-spring-webtestclient/README.md) | OpenAPI to Spring WebTestClient | OpenAPI |
| [ZDL to OpenAPI](./plugins/zdl-to-openapi/README.md) | ZDL to OpenAPI and OpenAPI to ZDL | ZDL, OpenAPI |
| [ZDL to AsyncAPI](./plugins/zdl-to-asyncapi/README.md) | ZDL to AsyncAPI | ZDL, AsyncAPI |
| [ZDL to Markdown](./plugins/zdl-to-markdown/README.md) | ZDL to Markdown | ZDL |
| [Java 2 JDL Reverse Engineering](./plugins/java-to-jdl/README.md) | Java 2 JDL Reverse Engineering | Java, JDL |

## Forking an Standard or Custom Plugin

One promise of ZenWave SDK is to be easily extensible and adaptable to your project or your organization needs and likes.

You can always fork an existing plugin with the following command:

```shell
jbang zw -p io.zenwave360.sdk.plugins.ForkPlugin -h
```

| **Option** | **Description** | **Type** | **Default** | **Values** |
|-------------------------|-------------------------------------------------------------------------------------|----------|------------------------------------------------------------------------|------------|
| `targetFolder` | | String | | |
| `sourcePluginClassName` | Plugin Plugin class to fork | String | | |
| `targetPluginClassName` | New Plugin Plugin class. It will be used for class name, package and maven groupId. | String | | |
| `downloadURL` | Download URL for the source code of original plugin in zip format | URL | https://github.com/ZenWave360/zenwave-sdk/archive/refs/tags/v1.4.0.zip | |

Example:

```shell
jbang zw -p io.zenwave360.sdk.plugins.ForkPlugin \
targetFolder=plugins/zdl-to-asyncapi \
sourcePluginClassName=io.zenwave360.sdk.plugins.ZDLToOpenAPIPlugin \
targetPluginClassName=io.zenwave360.sdk.plugins.ZDLToAsyncAPIPlugin
cd plugins/zdl-to-asyncapi
mvn clean install
```

Now you can add this jar to the list of available plugins in [jbang install command](#jbang-instalation)

# ZenWave SDK Documentation

Please refer to the [documentation](https://zenwave360.github.io/zenwave-sdk/) website for more information.