Skip to content

Commit

Permalink
docs: add documentation for generators (#116)
Browse files Browse the repository at this point in the history
  • Loading branch information
magicmatatjahu authored Mar 10, 2021
1 parent c221811 commit e7d9108
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 13 deletions.
38 changes: 26 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,13 @@ This package is under development and it has not reached version 1.0.0 yet, whic

- [Installation](#installation)
- [How it works](#how-it-works)
* [The transformation process](#the-transformation-process)
* [The simplification process](#the-simplification-process)
* [The generatiion process](#the-generatiion-process)
* [The input process](#the-input-process)
* [The generation process](#the-generation-process)
- [Example](#example)
- [Customisation](#customisation)
- [Supported input](#supported-input)
* [AsyncAPI input](#asyncapi-input)
* [JSON Schema input](#json-schema-input)
- [Customization](#customization)
- [Development](#development)
- [Contributing](#contributing)

Expand All @@ -41,27 +43,29 @@ Run this command to install the SDK in your project:
```bash
npm install --save @asyncapi/generator-model-sdk
```

## How it works

The process of creating data models from input data consists of 2 processes, the input and generation process.

### The input process

The input process ensures that any supported input is handled correctly, the basics are that any input needs to be converted into our internal model representation `CommonModel`. The following inputs are supported:
- [JSON Schema Draft 7](#JSON-Schema-input), this is the default inferred input if we cannot find a another input processor.

- [JSON Schema Draft 7](#JSON-Schema-input), this is the default inferred input if we cannot find another input processor.
- [AsyncAPI version 2.0.0](#AsyncAPI-input)

Read more about the input process [here](./docs/input_processing.md).

### The generation process

The generation process uses the predefined `CommonModel`s from the input stage to easily generate models regardless of input. The generator support the following output languages:
The generation process uses the predefined `CommonModel`s from the input stage to easily generate models regardless of input. The package supports the following output languages:

- JavaScript
- TypeScript
- Java

Check out [the example](#example) to see how to use the library.
Check out [the example](#example) to see how to use the library and [generators document](./docs/generators.md) for more info.

> **NOTE**: Each implemented language has different options, dictated by the nature of the language. Keep this in mind when selecting a language.
Expand Down Expand Up @@ -101,28 +105,38 @@ interface Address {
}
```
## Supported input

These are the supported inputs.

### AsyncAPI input

The library expects the `asyncapi` property for the document to be sat in order to understand the input format.
- Generate from a [parsed AsyncAPI document](https://github.com/asyncapi/parser-js)

- Generate from a [parsed AsyncAPI document](https://github.com/asyncapi/parser-js):

```js
const parser = require('@asyncapi/parser');
const doc = await parser.parse(`{asyncapi: '2.0.0'}`);
generator.generate(doc);
```
- Generate from a pure JS object

- Generate from a pure JS object:

```js
generator.generate({asyncapi: '2.0.0'});
```

### JSON Schema input
- Generate from a pure JS object

- Generate from a pure JS object:

```js
generator.generate({$schema: 'http://json-schema.org/draft-07/schema#'});
```

## Customisation
## Customization

The AsyncAPI Model SDK uses **preset** objects to extend the rendered model. For more information, check [customisation document](./docs/customisation.md).
The AsyncAPI Model SDK uses **preset** objects to extend the rendered model. For more information, check [customization document](./docs/customization.md).

## Development

Expand Down
2 changes: 1 addition & 1 deletion docs/customisation.md → docs/customization.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Customisation
# Customization

The AsyncAPI Model SDK uses **preset** objects to extend the rendered model.

Expand Down
55 changes: 55 additions & 0 deletions docs/generators.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Generators

**Generators** are classes that are used to render models for a given language.

## Supported languages

- [JavaScript](../src/generators/javascript/JavaScriptGenerator.ts),
- [TypeScript](../src/generators/typescript/TypeScriptGenerator.ts),
- [Java](../src/generators/java/JavaGenerator.ts).

## Generator's options

Each generator extends default options for the generator. It means that the generator can also have additional options.

Options are passed as the first argument to the generator's constructor. Check the example:

```ts
const generator = new TypeScriptGenerator({ ...options });
```

Default options contain:

| Option | Type | Description | Default value |
|---|---|---|---|
| `indentation` | Object | Options for indentation. | - |
| `indentation.type` | String | Type of indentation. Its value can be either `SPACES` or `TABS`. | `SPACES` |
| `indentation.size` | String | Size of indentation. | 2 |
| `defaultPreset` | Object | Default preset for generator. For more information, read [customization](./customization.md) document. | _Implemented by generator_ |
| `presets` | Array | Array contains **presets**. For more information, read [customization](./customization.md) document. | `[]` |

Below is a list of additional options available for a given generator.

### [TypeScript](../src/generators/typescript/TypeScriptGenerator.ts)

| Option | Type | Description | Default value |
|---|---|---|---|
| `renderTypes` | Boolean | Render signature for types. | `true` |
| `modelType` | String | It indicates which model type should be rendered for the `object` type. Its value can be either `interface` or `class`. | `class` |

## Custom generator

The minimum set of required actions to create a new generator are:

- Source code must be included in [generators](../src/generators) folder.
- Must extend the abstract [`AbstractGenerator`](../src/generators/AbstractGenerator.ts) class,
- Must define [`Preset`](./customization.md)'s shape for the language,
- Must define language options by passing an interface describing additional options to the first generic argument of [`AbstractGenerator`](../src/generators/AbstractGenerator.ts). The interface must also be extended by `CommonGeneratorOptions` interface,
- Must define default options as static class's field, which must be extended by `defaultGeneratorOptions`,
- Default options must include `defaultPreset` property,
- Must implement `render` function,
- Must define **Renderers** classes for available model types in a given language. **Renderer** is an instance of the class with common helper functions to render appropriate model type and must be extended by [`AbstractRenderer`](../src/generators/AbstractRenderer.ts) class - [example](../src/generators/typescript/renderers/ClassRenderer.ts).

Check the [generator implementation](../src/generators/typescript/TypeScriptGenerator.ts) for `TypeScript` language to see how it should look like.

If you created a generator then you can contribute it to the AsyncAPI Model SDK and it will become the official supported generator.

0 comments on commit e7d9108

Please sign in to comment.