diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md deleted file mode 100644 index e463fcd5..00000000 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -name: Bug Report -about: Report a bug encountered with the Serverless Workflow Typescript SDK -labels: kind/bug - ---- - -**What happened**: - -**What you expected to happen**: - -**How to reproduce it**: - -**Anything else we need to know?**: - -**Environment**: \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml new file mode 100644 index 00000000..cc04d792 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -0,0 +1,62 @@ +name: Bug Report +description: Create a bug report +labels: ["type: bug"] +body: + +- type: markdown + attributes: + value: | + :pray: Thanks for taking the time to fill out this bug report! + +- type: markdown + attributes: + value: | + ## Bug Report + +- type: textarea + id: i-tried-this + attributes: + label: "I tried this:" + placeholder: "What did you try to do? A code snippet or example helps." + validations: + required: true + +- type: textarea + id: instead-what-happened + attributes: + label: "This happened:" + placeholder: "What happened instead of what you've expected?" + validations: + required: true + +- type: textarea + id: what-did-you-expect + attributes: + label: "I expected this:" + placeholder: "What did you expect to happen? Describe the output or behavior you expected to see (unless it's obvious)." + +- type: textarea + id: workaround + attributes: + label: "Is there a workaround?" + placeholder: "What's the workaround to avoid this issue?" + +- type: textarea + attributes: + label: Anything else? + placeholder: | + Links? References? Logs? Anything that will give us more context about the issue you are encountering. + Tip: You can attach images or log files by dragging files in. + +- type: markdown + attributes: + value: | + ## Environment + +- type: textarea + attributes: + label: Community Notes + value: | + + * Please vote by adding a 👍 reaction to the issue to help us prioritize. + * If you are interested to work on this issue, please leave a comment.name: Bug Report 🐞 diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..c6d0e44f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,2 @@ +blank_issues_enabled: true +contact_links: [] \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/enhancement.md b/.github/ISSUE_TEMPLATE/enhancement.md deleted file mode 100644 index 56685e51..00000000 --- a/.github/ISSUE_TEMPLATE/enhancement.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: Enhancement Request -about: Suggest an enhancement to the Serverless Workflow Typescript SDK -labels: kind/feature - ---- - -**What would you like to be added**: - -**Why is this needed**: \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature.yml b/.github/ISSUE_TEMPLATE/feature.yml new file mode 100644 index 00000000..9809b25b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature.yml @@ -0,0 +1,48 @@ +name: Feature Request +description: Create a feature request +labels: ["type: feature"] +body: + +- type: markdown + attributes: + value: | + :pray: Thanks for taking the time to fill out this feature request! + +- type: markdown + attributes: + value: | + ## Feature Request + +- type: textarea + id: what-would-you-like-to-be-added + attributes: + label: "What would you like to be added?" + placeholder: "Description of the feature you'd like to see." + validations: + required: true + +- type: textarea + id: proposals + attributes: + label: "Proposal(s):" + placeholder: "Describe your proposal(s) and any relevant details here." + +- type: textarea + id: alternatives + attributes: + label: "Alternative(s):" + placeholder: "Describe any alternative approaches, options, or suggestions you’d like to consider." + +- type: textarea + id: additional-info + attributes: + label: "Additional info:" + placeholder: "Provide any supplementary details, context, or supporting information here." + +- type: textarea + attributes: + label: Community Notes + value: | + + * Please vote by adding a 👍 reaction to the feature to help us prioritize. + * If you are interested to work on this feature, please leave a comment. diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md deleted file mode 100644 index 88910eb8..00000000 --- a/.github/ISSUE_TEMPLATE/question.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -name: Question -about: Ask a question about the Serverless Workflow Typescript SDK -labels: kind/question - ---- - -**What is the question**: \ No newline at end of file diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 7fe57b39..214ccbef 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: - node-version: [10.x, 12.x, 14.x, 15.x] + node-version: [20.x, 21.x, 22.x] steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/npmjs-release.yml b/.github/workflows/npmjs-release.yml index 2adee8a9..6fbf07c7 100644 --- a/.github/workflows/npmjs-release.yml +++ b/.github/workflows/npmjs-release.yml @@ -11,7 +11,7 @@ jobs: # Setup .npmrc file to publish to npm - uses: actions/setup-node@v2 with: - node-version: '15.x' + node-version: '20.x' registry-url: 'https://registry.npmjs.org' - run: npm ci - run: npm test diff --git a/.whitesource b/.whitesource new file mode 100644 index 00000000..0d7ea094 --- /dev/null +++ b/.whitesource @@ -0,0 +1,13 @@ +{ + "scanSettings": { + "baseBranches": [] + }, + "checkRunSettings": { + "vulnerableCheckRunConclusionLevel": "failure", + "displayMode": "diff" + }, + "issueSettings": { + "minSeverityLevel": "LOW", + "issueType": "DEPENDENCY" + } +} \ No newline at end of file diff --git a/MAINTAINERS.md b/MAINTAINERS.md index b0a266b2..1127b64d 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -1,4 +1,11 @@ -# Serverless Workflow Typescript SDK Maintainers +# Serverless Workflow Org Maintainers +* [Jean-Baptiste Bianchi](https://github.com/JBBianchi) +* [Charles d'Avernas](https://github.com/cdavernas) +* [Ricardo Zanini](https://github.com/ricardozanini) + +# Serverless Workflow Org Emeritus Maintainers * [Antonio Mendoza Pérez](https://github.com/antmendoza) -* [Tihomir Surdilovic](https://github.com/tsurdilo) + +# Maintainers Mailing list +[cncf-serverlessws-maintainers](mailto:cncf-serverlessws-maintainers@lists.cncf.io) \ No newline at end of file diff --git a/README.md b/README.md index d1a5a6a6..7958088f 100644 --- a/README.md +++ b/README.md @@ -1,177 +1,368 @@ ![Node CI](https://github.com/serverlessworkflow/sdk-typescript/workflows/Node%20CI/badge.svg) [![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/serverlessworkflow/sdk-typescript) -# Serverless Workflow Specification - Typescript SDK - -Provides the Typescript API/SPI for the [Serverless Workflow Specification](https://github.com/serverlessworkflow/specification) - -With the SDK you can: -* Parse workflow JSON and YAML definitions +- [Serverless Workflow Specification - TypeScript SDK](#serverless-workflow-specification---typescript-sdk) + - [Status](#status) + - [SDK Structure](#sdk-structure) + - [Types and Interfaces](#types-and-interfaces) + - [Classes](#classes) + - [Fluent Builders](#fluent-builders) + - [Validation Function](#validation-function) + - [Other tools](#other-tools) + - [Getting Started](#getting-started) + - [Installation](#installation) + - [Usage](#usage) + - [Create a Workflow Definition from YAML or JSON](#create-a-workflow-definition-from-yaml-or-json) + - [Create a Workflow Definition by Casting an Object](#create-a-workflow-definition-by-casting-an-object) + - [Create a Workflow Definition Using a Class Constructor](#create-a-workflow-definition-using-a-class-constructor) + - [Create a Workflow Definition Using the Builder API](#create-a-workflow-definition-using-the-builder-api) + - [Serialize a Workflow Definition to YAML or JSON](#serialize-a-workflow-definition-to-yaml-or-json) + - [Validate Workflow Definitions](#validate-workflow-definitions) + - [Generate a directed graph](#generate-a-directed-graph) + - [Generate a MermaidJS flowchart](#generate-a-mermaidjs-flowchart) + - [Building Locally](#building-locally) + +# Serverless Workflow Specification - TypeScript SDK + +This SDK provides a TypeScript API for working with the [Serverless Workflow Specification](https://github.com/serverlessworkflow/specification). + +With this SDK, you can: +* Parse workflow definitions in JSON and YAML formats * Programmatically build workflow definitions * Validate workflow definitions +## Status +The npm [`@serverlessworkflow/sdk`](https://www.npmjs.com/package/@serverlessworkflow/sdk) package versioning aligns with the versioning of the [specification](https://github.com/serverlessworkflow/specification): + +| Latest Releases | Conformance to Spec Version | +| :---: | :---: | +| [v1.0.\*](https://github.com/serverlessworkflow/sdk-typescript/releases/) | [v1.0.0](https://github.com/serverlessworkflow/specification) | -### Status +> [!WARNING] +> Previous versions of the SDK were published with a typo in the scope: +> @severlessworkflow/sdk-typescript instead of +> @se**r**verlessworkflow/sdk-typescript -| Latest Releases | Conformance to spec version | +| Latest Releases | Conformance to Spec Version | | :---: | :---: | | [v1.0.0](https://github.com/serverlessworkflow/sdk-typescript/releases/) | [v0.6](https://github.com/serverlessworkflow/specification/tree/0.6.x) | +| [v2.0.0](https://github.com/serverlessworkflow/sdk-typescript/releases/) | [v0.7](https://github.com/serverlessworkflow/specification/tree/0.7.x) | +| [v3.0.0](https://github.com/serverlessworkflow/sdk-typescript/releases/) | [v0.8](https://github.com/serverlessworkflow/specification/tree/0.8.x) | +## SDK Structure +This SDK includes the following key components: +### Types and Interfaces +The SDK provides various TypeScript types and interfaces that ensure type safety and enhance the development experience by catching type errors during compile time. -## Getting Started +To avoid confusion with classes, these types and interfaces are exported under the **`Specification`** object, e.g., `Specification.Workflow`. -### Building locally +### Classes +The SDK includes classes that correspond to the aforementioned types and interfaces. These classes offer: -To build the project and run tests locally: +- **Instance Checking**: Easily verify if an object is an instance of a specific class. +- **Self-Validation**: Validate the internal state of an object to ensure it adheres to the expected structure. +- **Normalization**: Methods to normalize object data, ensuring consistent formatting and values. -```sh -git clone https://github.com/serverlessworkflow/sdk-typescript.git -cd sdk-typescript -npm install && npm run build && npm run test -``` +To avoid confusion with type definitions, these classes are exported under the **`Classes`** object, e.g., `Classes.Workflow`. +### Fluent Builders +The fluent builders wrap the core classes and provide a fluent API for constructing objects. This API allows you to chain method calls and configure objects in a more readable and convenient manner. -### How to use +The fluent builders are directly exported as `**Builder`, e.g., `workflowBuilder`. -#### Install +By default, built objects are self-validated and self-normalized. `BuildOptions` can be passed to the `build()` method to disable validation or normalization. -For the latest stable version: +### Validation Function +The SDK includes a validation function to check if objects conform to the expected schema. This function ensures that your workflow objects are correctly structured and meet the required specifications. + +The `validate` function is directly exported and can be used as `validate('Workflow', workflowObject)`. + +### Other Tools +The SDK also ships tools to build directed graph and MermaidJS flowcharts from a workflow. + +## Getting Started + +### Installation +> [!NOTE] +> Version v1.0.0.\* has not been released yet. ```sh -npm i @severlessworkflow/sdk-typescript +npm install @serverlessworkflow/sdk ``` -#### Create Workflow using builder API +### Usage +#### Create a Workflow Definition from YAML or JSON +You can deserialize a YAML or JSON representation of the workflow using the static method `Classes.Workflow.deserialize`: ```typescript -import { workflowBuilder, injectstateBuilder, Specification } from '@severlessworkflow/sdk-typescript'; - -const workflow: Specification.Workflow = workflowBuilder() - .id("helloworld") - .specVersion("0.7") - .version("1.0") - .name("Hello World Workflow") - .description("Inject Hello World") - .start("Hello State") - .states([ - injectstateBuilder() - .name("Hello State") - .data({ - "result": "Hello World!" - }) - .build() - ]) - .build(); +import { Classes } from '@serverlessworkflow/sdk'; + +// const text = await readFile('/some/path/my-workflow-definition.yaml', { encoding: 'utf8' }); +// const text = await fetch('https://myserver.com/my-workflow-definition.json'); +const text = ` +document: + dsl: 1.0.0 + name: test + version: 1.0.0 + namespace: default +do: +- step1: + set: + variable: 'my first workflow' +`; +const workflow = Classes.Workflow.deserialize(text); ``` -#### Create Workflow from JSON/YAML source +#### Create a Workflow Definition by Casting an Object +You can type-cast an object to match the structure of a workflow definition: ```typescript -import { Specification, Workflow } from '@severlessworkflow/sdk-typescript'; - -const source = `id: helloworld -version: '1.0' -specVerion: '0.7' -name: Hello World Workflow -description: Inject Hello World -start: Hello State -states: - - type: inject - name: Hello State - data: - result: Hello World! - end: true` - -const workflow: Specification.Workflow = Workflow.fromSource(source); +import { Classes, Specification, validate } from '@serverlessworkflow/sdk'; + +// Simply cast an object: +const workflow = { + document: { + dsl: '1.0.0', + name: 'test', + version: '1.0.0', + namespace: 'default', + }, + do: [ + { + step1: { + set: { + variable: 'my first workflow', + }, + }, + }, + ], +} as Specification.Workflow; + +// Validate it +try { + validate('Workflow', workflow); + // Serialize it + const definitionTxt = Classes.Workflow.serialize(workflow); +} +catch (ex) { + // Invalid workflow definition +} ``` -Where `source` can be in both JSON or YAML format. -#### Parse a Workflow instance to JSON/YAML +#### Create a Workflow Definition Using a Class Constructor +You can create a workflow definition by calling a constructor: -Having the following workflow instance: +```typescript +import { Classes, validate } from '@serverlessworkflow/sdk'; + +// Simply use the constructor +const workflow = new Classes.Workflow({ + document: { + dsl: '1.0.0', + name: 'test', + version: '1.0.0', + namespace: 'default', + }, + do: [/* + { + step1: { + set: { + variable: 'my first workflow', + }, + }, + }, + */], +}); +workflow.do.push({ + step1: new Classes.SetTask({ + set: { + variable: 'my first workflow', + } + }) +}); + +// Validate it +try { + workflow.validate(); + // Serialize it + const definitionTxt = workflow.serialize(); +} +catch (ex) { + // Invalid workflow definition +} +``` + +#### Create a Workflow Definition Using the Builder API +You can use the fluent API to build a validated and normalized workflow definition: ```typescript -import { workflowBuilder, injectstateBuilder, Specification } from '@severlessworkflow/sdk-typescript'; - -const workflow: Specification.Workflow = workflowBuilder() - .id("helloworld") - .version("1.0") - .specVersion("0.7") - .name("Hello World Workflow") - .description("Inject Hello World") - .start("Hello State") - .states([ - injectstateBuilder() - .name("Hello State") - .data({ - "result": "Hello World!" +import { documentBuilder, setTaskBuilder, taskListBuilder, workflowBuilder } from '@serverlessworkflow/sdk'; + +const workflow = workflowBuilder(/*workflowObject*/) + .document( + documentBuilder() + .dsl('1.0.0') + .name('test') + .version('1.0.0') + .namespace('default') + .build() + ) + .do( + taskListBuilder() + .push({ + step1: setTaskBuilder() + .set({ + variable: 'my first workflow' + }) + .build() }) - .end(true) .build() - ]) - .build(); + ) + .build(/*{ + validate: false, + normalize: false + }*/); ``` -You can convert it to its string representation in JSON or YAML format -by using the static methods `Workflow.toJson` or `Workflow.toYaml` respectively: +#### Serialize a Workflow Definition to YAML or JSON +You can serialize a workflow definition either by using its `serialize` method if it's an instance or the static method with the same name: ```typescript -import { Workflow } from '../src/lib/definitions/workflow'; +import { Classes } from '@serverlessworkflow/sdk'; -const workflowAsJson: string = Workflow.toJson(workflow); +// const workflow = ; +if (workflow instanceof Classes.Workflow) { + const yaml = workflow.serialize(/*'yaml' | 'json' */); +} +else { + const json = Classes.Workflow.serialize(workflow, 'json'); +} ``` +> [!NOTE] +> The default serialization format is YAML. -```typescript -import { Workflow } from '../src/lib/definitions/workflow'; +#### Validate Workflow Definitions +Validation can be achieved in two ways: via the `validate` function or the instance `validate` method: -const workflowAsYaml: string = Workflow.toYaml(workflow); +```typescript +import { Classes, validate } from '@serverlessworkflow/sdk'; + +const workflow = /* */; +try { + if (workflow instanceof Classes.Workflow) { + workflow.validate(); + } + else { + validate('Workflow', workflow); + } +} +catch (ex) { + // Workflow definition is invalid +} ``` +#### Generate a directed graph +A [directed graph](https://en.wikipedia.org/wiki/Directed_graph) of a workflow can be generated using the `buildGraph` function, or alternatives: +- Workflow instance `.toGraph();` +- Static `Classes.Workflow.toGraph(workflow)` -#### Validate workflow definitions - -The sdk provides a way to validate if a workflow object is compliant with the serverlessworkflow specification. - -`WorkflowValidator` class provides a validation method: +```typescript +import { buildGraph } from '@serverlessworkflow/sdk'; + +const workflow = { + document: { + dsl: '1.0.0', + name: 'using-plain-object', + version: '1.0.0', + namespace: 'default', + }, + do: [ + { + step1: { + set: { + variable: 'my first workflow', + }, + }, + }, + ], +}; +const graph = buildGraph(workflow); +// const workflow = new Classes.Workflow({...}); const graph = workflow.toGraph(); +// const graph = Classes.Workflow.toGraph(workflow); +/*{ + id: 'root', + type: 'root', + label: undefined, + parent: null, + nodes: [...], // length 3 - root entry node, step1 node, root exit node + edges: [...], // length 2 - entry to step1, step1 to exit + entryNode: {...}, // root entry node + exitNode: {...} // root exit node +}*/ +``` -- `validate(): boolean` +#### Generate a MermaidJS flowchart +Generating a [MermaidJS](https://mermaid.js.org/) flowchart can be achieved in two ways: using the `convertToMermaidCode`, the legacy `MermaidDiagram` class, or alternatives: +- Workflow instance `.toMermaidCode();` +- Static `Classes.Workflow.toMermaidCode(workflow)` ```typescript -import { WorkflowValidator, Specification } from '@severlessworkflow/sdk-typescript'; - -const workflow: Specification.Workflow = { - id: 'helloworld', - version: '1.0', - name: 'Hello World Workflow', - description: 'Inject Hello World', - start: 'Hello State', - states: [ +import { convertToMermaidCode, MermaidDiagram } from '@serverlessworkflow/sdk'; + +const workflow = { + document: { + dsl: '1.0.0', + name: 'using-plain-object', + version: '1.0.0', + namespace: 'default', + }, + do: [ { - type: 'inject', - name: 'Hello State', - end: true, - data: { - result: "Hello World!" - } - } as Specification.Injectstate - ] + step1: { + set: { + variable: 'my first workflow', + }, + }, + }, + ], }; +const mermaidCode = convertToMermaidCode(workflow) /* or */; +// const mermaidCode = new MermaidDiagram(workflow).sourceCode(); +// const workflow = new Classes.Workflow({...}); const mermaidCode = workflow.toMermaidCode(); +// const mermaidCode = Classes.Workflow.toMermaidCode(workflow); +/* +flowchart TD + root-entry-node(( )) + root-exit-node((( ))) + /do/0/step1["step1"] + /do/0/step1 --> root-exit-node + root-entry-node --> /do/0/step1 + + +classDef hidden display: none; +*/ +``` -const workflowValidator: WorkflowValidator = new WorkflowValidator(workflow); -if (!workflowValidator.isValid) { - workflowValidator.errors.forEach(error => console.error((error as ValidationError).message)); -} +```mermaid +flowchart TD + root-entry-node(( )) + root-exit-node((( ))) + /do/0/step1["step1"] + /do/0/step1 --> root-exit-node + root-entry-node --> /do/0/step1 + + +classDef hidden display: none; ``` -You can also validate parts of a workflow using `validators`: +### Building Locally -```typescript -import { ValidateFunction } from 'ajv'; -import { validators, Specification } from '@severlessworkflow/sdk-typescript'; +To build the project and run tests locally, use the following commands: -const injectionState: Specification.Injectstate = workflow.states[0]; -const injectionStateValidator: ValidateFunction = validators.get('Injectstate'); -if (!injectionStateValidator(injectionState)) { - injectionStateValidator.errors.forEach(error => console.error(error.message)); -} +```sh +git clone https://github.com/serverlessworkflow/sdk-typescript.git +cd sdk-typescript +npm install && npm run build && npm run test ``` + +If you're interested in contributing, reading the [Tooling Architecture](/tools/README.md) is a good place to start. \ No newline at end of file diff --git a/code-of-conduct.md b/code-of-conduct.md index 7a36efa1..c785c74c 100644 --- a/code-of-conduct.md +++ b/code-of-conduct.md @@ -1,59 +1,11 @@ -## CNCF Community Code of Conduct v1.0 +# Code of Conduct -Other languages available: -- [Chinese/中文](https://github.com/cncf/foundation/blob/master/code-of-conduct-languages/zh.md) -- [German/Deutsch](https://github.com/cncf/foundation/blob/master/code-of-conduct-languages/de.md) -- [Spanish/Español](https://github.com/cncf/foundation/blob/master/code-of-conduct-languages/es.md) -- [French/Français](https://github.com/cncf/foundation/blob/master/code-of-conduct-languages/fr.md) -- [Italian/Italiano](https://github.com/cncf/foundation/blob/master/code-of-conduct-languages/it.md) -- [Japanese/日本語](https://github.com/cncf/foundation/blob/master/code-of-conduct-languages/jp.md) -- [Korean/한국어](https://github.com/cncf/foundation/blob/master/code-of-conduct-languages/ko.md) -- [Ukrainian/Українська](https://github.com/cncf/foundation/blob/master/code-of-conduct-languages/uk.md) -- [Russian/Русский](https://github.com/cncf/foundation/blob/master/code-of-conduct-languages/ru.md) -- [Portuguese/Português](https://github.com/cncf/foundation/blob/master/code-of-conduct-languages/pt.md) -- [Arabic/العربية](https://github.com/cncf/foundation/blob/master/code-of-conduct-languages/ar.md) -- [Polish/Polski](https://github.com/cncf/foundation/blob/master/code-of-conduct-languages/pl.md) +We follow the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/main/code-of-conduct.md). -### Contributor Code of Conduct - -As contributors and maintainers of this project, and in the interest of fostering -an open and welcoming community, we pledge to respect all people who contribute -through reporting issues, posting feature requests, updating documentation, -submitting pull requests or patches, and other activities. - -We are committed to making participation in this project a harassment-free experience for -everyone, regardless of level of experience, gender, gender identity and expression, -sexual orientation, disability, personal appearance, body size, race, ethnicity, age, -religion, or nationality. - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery -* Personal attacks -* Trolling or insulting/derogatory comments -* Public or private harassment -* Publishing others' private information, such as physical or electronic addresses, - without explicit permission -* Other unethical or unprofessional conduct. - -Project maintainers have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are not -aligned to this Code of Conduct. By adopting this Code of Conduct, project maintainers -commit themselves to fairly and consistently applying these principles to every aspect -of managing this project. Project maintainers who do not follow or enforce the Code of -Conduct may be permanently removed from the project team. - -This code of conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. - -Instances of abusive, harassing, or otherwise unacceptable behavior in Kubernetes may be reported by contacting the [Kubernetes Code of Conduct Committee](https://git.k8s.io/community/committee-code-of-conduct) via conduct@kubernetes.io. For other projects, please contact a CNCF project maintainer or our mediator, Mishi Choudhary via mishi@linux.com. - -This Code of Conduct is adapted from the Contributor Covenant -(http://contributor-covenant.org), version 1.2.0, available at -http://contributor-covenant.org/version/1/2/0/ - - -### CNCF Events Code of Conduct - -CNCF events are governed by the Linux Foundation [Code of Conduct](https://events.linuxfoundation.org/code-of-conduct/) available on the event page. -This is designed to be compatible with the above policy and also includes more details on responding to incidents. \ No newline at end of file + +Please contact the [CNCF Code of Conduct Committee](mailto:conduct@cncf.io) +in order to report violations of the Code of Conduct. diff --git a/examples/browser/index.html b/examples/browser/index.html deleted file mode 100644 index 3aea1101..00000000 --- a/examples/browser/index.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - Serveless Workflow JS SDK - - - - - -
- - - - diff --git a/examples/browser/mermaid.html b/examples/browser/mermaid.html new file mode 100644 index 00000000..adfa781d --- /dev/null +++ b/examples/browser/mermaid.html @@ -0,0 +1,131 @@ + + + + + + Serveless Workflow + + + + + +

YAML or JSON:

+ +
+

+  
+  
+
+
+
\ No newline at end of file
diff --git a/examples/browser/using-class.html b/examples/browser/using-class.html
new file mode 100644
index 00000000..6f2f5ee4
--- /dev/null
+++ b/examples/browser/using-class.html
@@ -0,0 +1,44 @@
+
+
+
+
+  
+  Serveless Workflow
+  
+  
+
+
+
+  

+  
+  
+
+
+
\ No newline at end of file
diff --git a/examples/browser/using-fluent-api.html b/examples/browser/using-fluent-api.html
new file mode 100644
index 00000000..5f820985
--- /dev/null
+++ b/examples/browser/using-fluent-api.html
@@ -0,0 +1,36 @@
+
+
+
+
+  
+  Serveless Workflow
+  
+  
+
+
+
+  

+  
+  
+
+
+
\ No newline at end of file
diff --git a/examples/browser/using-json.html b/examples/browser/using-json.html
new file mode 100644
index 00000000..f5e744e1
--- /dev/null
+++ b/examples/browser/using-json.html
@@ -0,0 +1,40 @@
+
+
+
+
+  
+  Serveless Workflow
+  
+  
+
+
+
+  

+  
+  
+
+
+
\ No newline at end of file
diff --git a/examples/browser/using-plain-object.html b/examples/browser/using-plain-object.html
new file mode 100644
index 00000000..76ffe685
--- /dev/null
+++ b/examples/browser/using-plain-object.html
@@ -0,0 +1,45 @@
+
+
+
+
+  
+  Serveless Workflow
+  
+  
+
+
+
+  

+  
+  
+
+
+
\ No newline at end of file
diff --git a/examples/node/index.js b/examples/node/index.js
deleted file mode 100644
index d4bfb805..00000000
--- a/examples/node/index.js
+++ /dev/null
@@ -1,18 +0,0 @@
-const { workflowBuilder, injectstateBuilder } = require('../../dist');
-const workflow = workflowBuilder()
-                  .id("helloworld")
-                  .version("1.0")
-                  .name("Hello World Workflow")
-                  .description("Inject Hello World")
-                  .start("Hello State")
-                  .states([
-                    injectstateBuilder()
-                      .name("Hello State")
-                      .data({
-                          "result": "Hello World!"
-                      })
-                      .end(true)
-                      .build()
-                  ])
-                  .build();
-console.log(workflow.id);
\ No newline at end of file
diff --git a/examples/node/index.ts b/examples/node/index.ts
deleted file mode 100644
index 54dd27b9..00000000
--- a/examples/node/index.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { workflowBuilder, injectstateBuilder, Specification } from '../../dist';
-const workflow: Specification.Workflow = workflowBuilder()
-  .id('helloworld')
-  .version('1.0')
-  .name('Hello World Workflow')
-  .description('Inject Hello World')
-  .start('Hello State')
-  .states([
-    injectstateBuilder()
-      .name('Hello State')
-      .data({
-        result: 'Hello World!',
-      })
-      .end(true)
-      .build(),
-  ])
-  .build();
-console.log(workflow.id);
diff --git a/examples/node/tsconfig.json b/examples/node/tsconfig.json
index a86f07e5..4280ce73 100644
--- a/examples/node/tsconfig.json
+++ b/examples/node/tsconfig.json
@@ -1,3 +1,3 @@
-{
-  "extends": "../../tsconfig.base.json"
-}
+{
+  "extends": "../../tsconfig.base.json"
+}
\ No newline at end of file
diff --git a/tests/lib/definitions/action.spec.ts b/examples/node/using-class.ts
similarity index 53%
rename from tests/lib/definitions/action.spec.ts
rename to examples/node/using-class.ts
index 5c239e80..bdf2546e 100644
--- a/tests/lib/definitions/action.spec.ts
+++ b/examples/node/using-class.ts
@@ -12,23 +12,31 @@
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
- *
  */
+import { Classes } from /*'@serverlessworkflow/sdk';*/ '../../dist';
+const { Workflow } = Classes;
 
-import { Action } from '../../../src/lib/definitions/action';
-
-describe('Action ', () => {
-  it('should convert non-primitive properties to the desired class', () => {
-    const data = {
-      functionRef: {},
-      eventRef: {},
-      actionDataFilter: {},
-    };
-
-    const model = new Action(data);
-
-    expect(model.functionRef!.constructor.name).toBe('Functionref');
-    expect(model.eventRef!.constructor.name).toBe('Eventref');
-    expect(model.actionDataFilter!.constructor.name).toBe('Actiondatafilter');
-  });
+const workflow = new Workflow({
+  document: {
+    dsl: '1.0.0',
+    name: 'using-class',
+    version: '1.0.0',
+    namespace: 'default',
+  },
+  do: [
+    {
+      step1: {
+        set: {
+          variable: 'my first workflow',
+        },
+      },
+    },
+  ],
 });
+
+try {
+  workflow.validate();
+  console.log(`--- YAML ---\n${workflow.serialize()}\n\n--- JSON ---\n${workflow.serialize('json')}`);
+} catch (ex) {
+  console.error('Invalid workflow', ex);
+}
diff --git a/src/lib/definitions/correlationDef.ts b/examples/node/using-fluent-api.ts
similarity index 50%
rename from src/lib/definitions/correlationDef.ts
rename to examples/node/using-fluent-api.ts
index f8f6adef..93ea9469 100644
--- a/src/lib/definitions/correlationDef.ts
+++ b/examples/node/using-fluent-api.ts
@@ -13,18 +13,25 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+import {
+  documentBuilder,
+  setTaskBuilder,
+  taskListBuilder,
+  workflowBuilder,
+} from /*'@serverlessworkflow/sdk';*/ '../../dist';
 
-export class CorrelationDef {
-  constructor(model: any) {
-    Object.assign(this, model);
-  }
-
-  /**
-   * CloudEvent Extension Context Attribute name
-   */
-  contextAttributeName: string;
-  /**
-   * CloudEvent Extension Context Attribute value
-   */
-  contextAttributeValue?: string;
+try {
+  const workflow = workflowBuilder()
+    .document(documentBuilder().dsl('1.0.0').name('using-fluent-api').version('1.0.0').namespace('default').build())
+    .do(
+      taskListBuilder()
+        .push({
+          step1: setTaskBuilder().set({ foo: 'bar' }).build(),
+        })
+        .build(),
+    )
+    .build();
+  console.log(`--- YAML ---\n${workflow.serialize()}\n\n--- JSON ---\n${workflow.serialize('json')}`);
+} catch (ex) {
+  console.error('Invalid workflow', ex);
 }
diff --git a/examples/node/using-json.ts b/examples/node/using-json.ts
new file mode 100644
index 00000000..70ab96d7
--- /dev/null
+++ b/examples/node/using-json.ts
@@ -0,0 +1,22 @@
+import { Classes } from /*'@serverlessworkflow/sdk';*/ '../../dist';
+
+const myJsonWorkflow = `
+{
+  "document": {
+    "dsl": "1.0.0",
+    "name": "using-json",
+    "version": "1.0.0",
+    "namespace": "default"
+  },
+  "do": [
+    {
+      "step1": {
+        "set": {
+          "variable": "my first workflow"
+        }
+      }
+    }
+  ]
+}`;
+const workflow = Classes.Workflow.deserialize(myJsonWorkflow);
+console.log(`--- YAML ---\n${workflow.serialize()}\n\n--- JSON ---\n${workflow.serialize('json')}`);
diff --git a/examples/node/using-plain-object.ts b/examples/node/using-plain-object.ts
new file mode 100644
index 00000000..c1d704a2
--- /dev/null
+++ b/examples/node/using-plain-object.ts
@@ -0,0 +1,27 @@
+import { Classes, Specification, validate } from /*'@serverlessworkflow/sdk';*/ '../../dist';
+
+const workflowDefinition = {
+  document: {
+    dsl: '1.0.0',
+    name: 'using-plain-object',
+    version: '1.0.0',
+    namespace: 'default',
+  },
+  do: [
+    {
+      step1: {
+        set: {
+          variable: 'my first workflow',
+        },
+      },
+    },
+  ],
+} as Specification.Workflow;
+try {
+  validate('Workflow', workflowDefinition);
+  console.log(
+    `--- YAML ---\n${Classes.Workflow.serialize(workflowDefinition)}\n\n--- JSON ---\n${Classes.Workflow.serialize(workflowDefinition, 'json')}`,
+  );
+} catch (ex) {
+  console.error('Invalid workflow', ex);
+}
diff --git a/jest.config.js b/jest.config.js
new file mode 100644
index 00000000..8b7fb4d5
--- /dev/null
+++ b/jest.config.js
@@ -0,0 +1,7 @@
+/** @type {import('ts-jest/dist/types').JestConfigWithTsJest} */
+module.exports = {
+  preset: 'ts-jest',
+  testEnvironment: 'node',
+  testPathIgnorePatterns: [".d.ts", ".js"],
+  modulePathIgnorePatterns: ['/dist/', '/out-tsc/'],
+};
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index f45ad781..7e405524 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,783 +1,808 @@
 {
-  "name": "@severlessworkflow/sdk-typescript",
-  "version": "2.0.0",
-  "lockfileVersion": 2,
+  "name": "@serverlessworkflow/sdk",
+  "version": "1.0.0",
+  "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
-      "name": "@severlessworkflow/sdk-typescript",
-      "version": "2.0.0",
+      "name": "@serverlessworkflow/sdk",
+      "version": "1.0.0",
       "license": "http://www.apache.org/licenses/LICENSE-2.0.txt",
       "dependencies": {
-        "ajv": "^8.1.0",
+        "ajv": "^8.17.1",
+        "ajv-formats": "^3.0.1",
         "js-yaml": "^4.1.0"
       },
       "devDependencies": {
-        "@apidevtools/json-schema-ref-parser": "^9.0.7",
-        "@dtsgenerator/replace-namespace": "^1.4.1",
-        "@rollup/plugin-commonjs": "^19.0.0",
-        "@rollup/plugin-json": "^4.1.0",
-        "@rollup/plugin-node-resolve": "^13.0.0",
-        "@types/jasmine": "^3.6.10",
-        "@types/js-yaml": "^4.0.1",
-        "@types/node-fetch": "^2.5.10",
-        "@types/rimraf": "^3.0.0",
-        "@types/yargs": "^16.0.1",
-        "@typescript-eslint/eslint-plugin": "^4.23.0",
-        "@typescript-eslint/parser": "^4.23.0",
-        "dtsgenerator": "^3.10.0",
-        "eslint": "^7.26.0",
-        "eslint-config-prettier": "^8.3.0",
-        "eslint-plugin-prettier": "^3.4.0",
-        "husky": "6.0.0",
-        "jasmine": "^3.7.0",
-        "lint-staged": "11.0.0",
-        "node-fetch": "^2.6.1",
-        "prettier": "^2.3.0",
-        "rimraf": "^3.0.2",
-        "rollup": "^2.47.0",
+        "@apidevtools/json-schema-ref-parser": "^11.6.4",
+        "@rollup/plugin-commonjs": "^26.0.1",
+        "@rollup/plugin-json": "^6.1.0",
+        "@rollup/plugin-node-resolve": "^15.2.3",
+        "@types/jest": "^29.5.12",
+        "@types/js-yaml": "^4.0.9",
+        "@types/node-fetch": "^2.6.11",
+        "@types/rimraf": "^4.0.5",
+        "@types/yargs": "^17.0.32",
+        "@typescript-eslint/eslint-plugin": "^7.16.1",
+        "@typescript-eslint/parser": "^7.16.1",
+        "eslint": "^8.57.0",
+        "eslint-config-prettier": "^9.1.0",
+        "eslint-plugin-prettier": "^5.1.3",
+        "husky": "^9.0.11",
+        "jest": "^29.7.0",
+        "json-schema-to-typescript": "^15.0.2",
+        "lint-staged": "^15.2.7",
+        "node-fetch": "^3.3.2",
+        "prettier": "^3.3.3",
+        "rimraf": "^6.0.1",
+        "rollup": "^2.79.1",
         "rollup-plugin-sourcemaps": "^0.6.3",
         "rollup-plugin-terser": "^7.0.2",
-        "rollup-plugin-typescript2": "^0.30.0",
-        "shx": "^0.3.3",
-        "ts-node": "^9.1.1",
-        "typescript": "^4.2.4",
-        "yargs": "^17.0.1"
+        "rollup-plugin-typescript2": "^0.36.0",
+        "shx": "^0.3.4",
+        "ts-inference-check": "^0.3.0",
+        "ts-jest": "^29.2.2",
+        "ts-morph": "^23.0.0",
+        "ts-node": "^10.9.2",
+        "typescript": "^5.5.3",
+        "yargs": "^17.7.2"
       },
       "engines": {
-        "node": ">=15.0",
-        "npm": ">=7.0.0"
+        "node": ">=20.0",
+        "npm": ">=10.0.0"
       }
     },
-    "node_modules/@apidevtools/json-schema-ref-parser": {
-      "version": "9.0.7",
-      "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.7.tgz",
-      "integrity": "sha512-QdwOGF1+eeyFh+17v2Tz626WX0nucd1iKOm6JUTUvCZdbolblCOOQCxGrQPY0f7jEhn36PiAWqZnsC2r5vmUWg==",
+    "node_modules/@ampproject/remapping": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+      "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
       "dev": true,
       "dependencies": {
-        "@jsdevtools/ono": "^7.1.3",
-        "call-me-maybe": "^1.0.1",
-        "js-yaml": "^3.13.1"
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      },
+      "engines": {
+        "node": ">=6.0.0"
       }
     },
-    "node_modules/@apidevtools/json-schema-ref-parser/node_modules/argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+    "node_modules/@apidevtools/json-schema-ref-parser": {
+      "version": "11.6.4",
+      "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.6.4.tgz",
+      "integrity": "sha512-9K6xOqeevacvweLGik6LnZCb1fBtCOSIWQs8d096XGeqoLKC33UVMGz9+77Gw44KvbH4pKcQPWo4ZpxkXYj05w==",
       "dev": true,
       "dependencies": {
-        "sprintf-js": "~1.0.2"
+        "@jsdevtools/ono": "^7.1.3",
+        "@types/json-schema": "^7.0.15",
+        "js-yaml": "^4.1.0"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/philsturgeon"
       }
     },
-    "node_modules/@apidevtools/json-schema-ref-parser/node_modules/js-yaml": {
-      "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
-      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+    "node_modules/@babel/code-frame": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
+      "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
       "dev": true,
       "dependencies": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
+        "@babel/highlight": "^7.24.7",
+        "picocolors": "^1.0.0"
       },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
+      "engines": {
+        "node": ">=6.9.0"
       }
     },
-    "node_modules/@babel/code-frame": {
-      "version": "7.12.13",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
-      "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
+    "node_modules/@babel/compat-data": {
+      "version": "7.24.9",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz",
+      "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==",
       "dev": true,
-      "dependencies": {
-        "@babel/highlight": "^7.12.13"
+      "engines": {
+        "node": ">=6.9.0"
       }
     },
-    "node_modules/@babel/helper-validator-identifier": {
-      "version": "7.14.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz",
-      "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==",
-      "dev": true
-    },
-    "node_modules/@babel/highlight": {
-      "version": "7.14.0",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz",
-      "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==",
+    "node_modules/@babel/core": {
+      "version": "7.24.9",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz",
+      "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-validator-identifier": "^7.14.0",
-        "chalk": "^2.0.0",
-        "js-tokens": "^4.0.0"
+        "@ampproject/remapping": "^2.2.0",
+        "@babel/code-frame": "^7.24.7",
+        "@babel/generator": "^7.24.9",
+        "@babel/helper-compilation-targets": "^7.24.8",
+        "@babel/helper-module-transforms": "^7.24.9",
+        "@babel/helpers": "^7.24.8",
+        "@babel/parser": "^7.24.8",
+        "@babel/template": "^7.24.7",
+        "@babel/traverse": "^7.24.8",
+        "@babel/types": "^7.24.9",
+        "convert-source-map": "^2.0.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.2",
+        "json5": "^2.2.3",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/babel"
       }
     },
-    "node_modules/@dtsgenerator/replace-namespace": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/@dtsgenerator/replace-namespace/-/replace-namespace-1.4.1.tgz",
-      "integrity": "sha512-L0DFdirXdb6CBYiV5ILYfcgqY83ThhhYBhauhn3MserpTPs+ODLLMGCRPyWPAxH9z7YUCho3y37si7EVGfJYJQ==",
+    "node_modules/@babel/core/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
       "dev": true,
-      "dependencies": {
-        "dtsgenerator": "^3.5.0",
-        "tslib": "^2.0.3"
+      "bin": {
+        "semver": "bin/semver.js"
       }
     },
-    "node_modules/@eslint/eslintrc": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.1.tgz",
-      "integrity": "sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ==",
+    "node_modules/@babel/generator": {
+      "version": "7.24.10",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz",
+      "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==",
       "dev": true,
       "dependencies": {
-        "ajv": "^6.12.4",
-        "debug": "^4.1.1",
-        "espree": "^7.3.0",
-        "globals": "^12.1.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.2.1",
-        "js-yaml": "^3.13.1",
-        "minimatch": "^3.0.4",
-        "strip-json-comments": "^3.1.1"
+        "@babel/types": "^7.24.9",
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.25",
+        "jsesc": "^2.5.1"
       },
       "engines": {
-        "node": "^10.12.0 || >=12.0.0"
+        "node": ">=6.9.0"
       }
     },
-    "node_modules/@eslint/eslintrc/node_modules/ajv": {
-      "version": "6.12.6",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+    "node_modules/@babel/helper-compilation-targets": {
+      "version": "7.24.8",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz",
+      "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==",
       "dev": true,
       "dependencies": {
-        "fast-deep-equal": "^3.1.1",
-        "fast-json-stable-stringify": "^2.0.0",
-        "json-schema-traverse": "^0.4.1",
-        "uri-js": "^4.2.2"
+        "@babel/compat-data": "^7.24.8",
+        "@babel/helper-validator-option": "^7.24.8",
+        "browserslist": "^4.23.1",
+        "lru-cache": "^5.1.1",
+        "semver": "^6.3.1"
       },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/epoberezkin"
+      "engines": {
+        "node": ">=6.9.0"
       }
     },
-    "node_modules/@eslint/eslintrc/node_modules/argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+    "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
       "dev": true,
-      "dependencies": {
-        "sprintf-js": "~1.0.2"
+      "bin": {
+        "semver": "bin/semver.js"
       }
     },
-    "node_modules/@eslint/eslintrc/node_modules/globals": {
-      "version": "12.4.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
-      "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+    "node_modules/@babel/helper-environment-visitor": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz",
+      "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==",
       "dev": true,
       "dependencies": {
-        "type-fest": "^0.8.1"
+        "@babel/types": "^7.24.7"
       },
       "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "node": ">=6.9.0"
       }
     },
-    "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
-      "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
-      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+    "node_modules/@babel/helper-function-name": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz",
+      "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==",
       "dev": true,
       "dependencies": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
+        "@babel/template": "^7.24.7",
+        "@babel/types": "^7.24.7"
       },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
+      "engines": {
+        "node": ">=6.9.0"
       }
     },
-    "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-      "dev": true
-    },
-    "node_modules/@eslint/eslintrc/node_modules/type-fest": {
-      "version": "0.8.1",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+    "node_modules/@babel/helper-hoist-variables": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz",
+      "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==",
       "dev": true,
+      "dependencies": {
+        "@babel/types": "^7.24.7"
+      },
       "engines": {
-        "node": ">=8"
+        "node": ">=6.9.0"
       }
     },
-    "node_modules/@jsdevtools/ono": {
-      "version": "7.1.3",
-      "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz",
-      "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==",
-      "dev": true
+    "node_modules/@babel/helper-module-imports": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz",
+      "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
     },
-    "node_modules/@nodelib/fs.scandir": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz",
-      "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==",
+    "node_modules/@babel/helper-module-transforms": {
+      "version": "7.24.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz",
+      "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==",
       "dev": true,
       "dependencies": {
-        "@nodelib/fs.stat": "2.0.4",
-        "run-parallel": "^1.1.9"
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-module-imports": "^7.24.7",
+        "@babel/helper-simple-access": "^7.24.7",
+        "@babel/helper-split-export-declaration": "^7.24.7",
+        "@babel/helper-validator-identifier": "^7.24.7"
       },
       "engines": {
-        "node": ">= 8"
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
       }
     },
-    "node_modules/@nodelib/fs.stat": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz",
-      "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==",
+    "node_modules/@babel/helper-plugin-utils": {
+      "version": "7.24.8",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz",
+      "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==",
       "dev": true,
       "engines": {
-        "node": ">= 8"
+        "node": ">=6.9.0"
       }
     },
-    "node_modules/@nodelib/fs.walk": {
-      "version": "1.2.6",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz",
-      "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==",
+    "node_modules/@babel/helper-simple-access": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz",
+      "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==",
       "dev": true,
       "dependencies": {
-        "@nodelib/fs.scandir": "2.1.4",
-        "fastq": "^1.6.0"
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
       },
       "engines": {
-        "node": ">= 8"
+        "node": ">=6.9.0"
       }
     },
-    "node_modules/@rollup/plugin-commonjs": {
-      "version": "19.0.0",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-19.0.0.tgz",
-      "integrity": "sha512-adTpD6ATGbehdaQoZQ6ipDFhdjqsTgpOAhFiPwl+dzre4pPshsecptDPyEFb61JMJ1+mGljktaC4jI8ARMSNyw==",
+    "node_modules/@babel/helper-split-export-declaration": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz",
+      "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==",
       "dev": true,
       "dependencies": {
-        "@rollup/pluginutils": "^3.1.0",
-        "commondir": "^1.0.1",
-        "estree-walker": "^2.0.1",
-        "glob": "^7.1.6",
-        "is-reference": "^1.2.1",
-        "magic-string": "^0.25.7",
-        "resolve": "^1.17.0"
+        "@babel/types": "^7.24.7"
       },
       "engines": {
-        "node": ">= 8.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^2.38.3"
+        "node": ">=6.9.0"
       }
     },
-    "node_modules/@rollup/plugin-commonjs/node_modules/estree-walker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
-      "dev": true
+    "node_modules/@babel/helper-string-parser": {
+      "version": "7.24.8",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
+      "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
     },
-    "node_modules/@rollup/plugin-json": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz",
-      "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==",
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
+      "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-option": {
+      "version": "7.24.8",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz",
+      "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helpers": {
+      "version": "7.24.8",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz",
+      "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==",
       "dev": true,
       "dependencies": {
-        "@rollup/pluginutils": "^3.0.8"
+        "@babel/template": "^7.24.7",
+        "@babel/types": "^7.24.8"
       },
-      "peerDependencies": {
-        "rollup": "^1.20.0 || ^2.0.0"
+      "engines": {
+        "node": ">=6.9.0"
       }
     },
-    "node_modules/@rollup/plugin-node-resolve": {
-      "version": "13.0.0",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.0.0.tgz",
-      "integrity": "sha512-41X411HJ3oikIDivT5OKe9EZ6ud6DXudtfNrGbC4nniaxx2esiWjkLOzgnZsWq1IM8YIeL2rzRGLZLBjlhnZtQ==",
+    "node_modules/@babel/highlight": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
+      "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
       "dev": true,
       "dependencies": {
-        "@rollup/pluginutils": "^3.1.0",
-        "@types/resolve": "1.17.1",
-        "builtin-modules": "^3.1.0",
-        "deepmerge": "^4.2.2",
-        "is-module": "^1.0.0",
-        "resolve": "^1.19.0"
+        "@babel/helper-validator-identifier": "^7.24.7",
+        "chalk": "^2.4.2",
+        "js-tokens": "^4.0.0",
+        "picocolors": "^1.0.0"
       },
       "engines": {
-        "node": ">= 10.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^2.42.0"
+        "node": ">=6.9.0"
       }
     },
-    "node_modules/@rollup/pluginutils": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
-      "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
+    "node_modules/@babel/highlight/node_modules/ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
       "dev": true,
       "dependencies": {
-        "@types/estree": "0.0.39",
-        "estree-walker": "^1.0.1",
-        "picomatch": "^2.2.2"
+        "color-convert": "^1.9.0"
       },
       "engines": {
-        "node": ">= 8.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^1.20.0||^2.0.0"
+        "node": ">=4"
       }
     },
-    "node_modules/@types/estree": {
-      "version": "0.0.39",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
-      "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
-      "dev": true
-    },
-    "node_modules/@types/glob": {
-      "version": "7.1.3",
-      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
-      "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
+    "node_modules/@babel/highlight/node_modules/chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
       "dev": true,
       "dependencies": {
-        "@types/minimatch": "*",
-        "@types/node": "*"
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "engines": {
+        "node": ">=4"
       }
     },
-    "node_modules/@types/jasmine": {
-      "version": "3.6.10",
-      "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.10.tgz",
-      "integrity": "sha512-yfCl7JGtIc5LjScFpeIGBBNhJFkJdAAcsAnAd9ZRHwzh+sR2zkt257BKkTCF5VpJ8wMPnzzZ8QatRdXM8tqpKA==",
-      "dev": true
-    },
-    "node_modules/@types/js-yaml": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.1.tgz",
-      "integrity": "sha512-xdOvNmXmrZqqPy3kuCQ+fz6wA0xU5pji9cd1nDrflWaAWtYLLGk5ykW0H6yg5TVyehHP1pfmuuSaZkhP+kspVA==",
-      "dev": true
-    },
-    "node_modules/@types/json-schema": {
-      "version": "7.0.7",
-      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz",
-      "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==",
-      "dev": true
-    },
-    "node_modules/@types/minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==",
-      "dev": true
-    },
-    "node_modules/@types/node": {
-      "version": "15.0.1",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.1.tgz",
-      "integrity": "sha512-TMkXt0Ck1y0KKsGr9gJtWGjttxlZnnvDtphxUOSd0bfaR6Q1jle+sPvrzNR1urqYTWMinoKvjKfXUGsumaO1PA==",
-      "dev": true
-    },
-    "node_modules/@types/node-fetch": {
-      "version": "2.5.10",
-      "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.10.tgz",
-      "integrity": "sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ==",
+    "node_modules/@babel/highlight/node_modules/color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
       "dev": true,
       "dependencies": {
-        "@types/node": "*",
-        "form-data": "^3.0.0"
+        "color-name": "1.1.3"
       }
     },
-    "node_modules/@types/parse-json": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
-      "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
+    "node_modules/@babel/highlight/node_modules/color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
       "dev": true
     },
-    "node_modules/@types/resolve": {
-      "version": "1.17.1",
-      "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
-      "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
+    "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
       "dev": true,
-      "dependencies": {
-        "@types/node": "*"
+      "engines": {
+        "node": ">=0.8.0"
       }
     },
-    "node_modules/@types/rimraf": {
+    "node_modules/@babel/highlight/node_modules/has-flag": {
       "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.0.tgz",
-      "integrity": "sha512-7WhJ0MdpFgYQPXlF4Dx+DhgvlPCfz/x5mHaeDQAKhcenvQP1KCpLQ18JklAqeGMYSAT2PxLpzd0g2/HE7fj7hQ==",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
       "dev": true,
-      "dependencies": {
-        "@types/glob": "*",
-        "@types/node": "*"
+      "engines": {
+        "node": ">=4"
       }
     },
-    "node_modules/@types/yargs": {
-      "version": "16.0.1",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.1.tgz",
-      "integrity": "sha512-x4HABGLyzr5hKUzBC9dvjciOTm11WVH1NWonNjGgxapnTHu5SWUqyqn0zQ6Re0yQU0lsQ6ztLCoMAKDGZflyxA==",
+    "node_modules/@babel/highlight/node_modules/supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
       "dev": true,
       "dependencies": {
-        "@types/yargs-parser": "*"
+        "has-flag": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
       }
     },
-    "node_modules/@types/yargs-parser": {
-      "version": "20.2.0",
-      "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz",
-      "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==",
-      "dev": true
-    },
-    "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "4.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.23.0.tgz",
-      "integrity": "sha512-tGK1y3KIvdsQEEgq6xNn1DjiFJtl+wn8JJQiETtCbdQxw1vzjXyAaIkEmO2l6Nq24iy3uZBMFQjZ6ECf1QdgGw==",
+    "node_modules/@babel/parser": {
+      "version": "7.24.8",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz",
+      "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==",
       "dev": true,
-      "dependencies": {
-        "@typescript-eslint/experimental-utils": "4.23.0",
-        "@typescript-eslint/scope-manager": "4.23.0",
-        "debug": "^4.1.1",
-        "functional-red-black-tree": "^1.0.1",
-        "lodash": "^4.17.15",
-        "regexpp": "^3.0.0",
-        "semver": "^7.3.2",
-        "tsutils": "^3.17.1"
+      "bin": {
+        "parser": "bin/babel-parser.js"
       },
       "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependencies": {
-        "@typescript-eslint/parser": "^4.0.0",
-        "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
+        "node": ">=6.0.0"
       }
     },
-    "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": {
-      "version": "7.3.5",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+    "node_modules/@babel/plugin-syntax-async-generators": {
+      "version": "7.8.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
       "dev": true,
       "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
+        "@babel/helper-plugin-utils": "^7.8.0"
       },
-      "engines": {
-        "node": ">=10"
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@typescript-eslint/experimental-utils": {
-      "version": "4.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.23.0.tgz",
-      "integrity": "sha512-WAFNiTDnQfrF3Z2fQ05nmCgPsO5o790vOhmWKXbbYQTO9erE1/YsFot5/LnOUizLzU2eeuz6+U/81KV5/hFTGA==",
+    "node_modules/@babel/plugin-syntax-bigint": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+      "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
       "dev": true,
       "dependencies": {
-        "@types/json-schema": "^7.0.3",
-        "@typescript-eslint/scope-manager": "4.23.0",
-        "@typescript-eslint/types": "4.23.0",
-        "@typescript-eslint/typescript-estree": "4.23.0",
-        "eslint-scope": "^5.0.0",
-        "eslint-utils": "^2.0.0"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
+        "@babel/helper-plugin-utils": "^7.8.0"
       },
       "peerDependencies": {
-        "eslint": "*"
+        "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@typescript-eslint/parser": {
-      "version": "4.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.23.0.tgz",
-      "integrity": "sha512-wsvjksHBMOqySy/Pi2Q6UuIuHYbgAMwLczRl4YanEPKW5KVxI9ZzDYh3B5DtcZPQTGRWFJrfcbJ6L01Leybwug==",
+    "node_modules/@babel/plugin-syntax-class-properties": {
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+      "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/scope-manager": "4.23.0",
-        "@typescript-eslint/types": "4.23.0",
-        "@typescript-eslint/typescript-estree": "4.23.0",
-        "debug": "^4.1.1"
+        "@babel/helper-plugin-utils": "^7.12.13"
       },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-import-meta": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+      "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.10.4"
       },
       "peerDependencies": {
-        "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0"
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-json-strings": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+      "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
       },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@typescript-eslint/scope-manager": {
-      "version": "4.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.23.0.tgz",
-      "integrity": "sha512-ZZ21PCFxPhI3n0wuqEJK9omkw51wi2bmeKJvlRZPH5YFkcawKOuRMQMnI8mH6Vo0/DoHSeZJnHiIx84LmVQY+w==",
+    "node_modules/@babel/plugin-syntax-jsx": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz",
+      "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "4.23.0",
-        "@typescript-eslint/visitor-keys": "4.23.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
-        "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
+        "node": ">=6.9.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@typescript-eslint/types": {
-      "version": "4.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.23.0.tgz",
-      "integrity": "sha512-oqkNWyG2SLS7uTWLZf6Sr7Dm02gA5yxiz1RP87tvsmDsguVATdpVguHr4HoGOcFOpCvx9vtCSCyQUGfzq28YCw==",
+    "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+      "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
       "dev": true,
-      "engines": {
-        "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.10.4"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "4.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.23.0.tgz",
-      "integrity": "sha512-5Sty6zPEVZF5fbvrZczfmLCOcby3sfrSPu30qKoY1U3mca5/jvU5cwsPb/CO6Q3ByRjixTMIVsDkqwIxCf/dMw==",
+    "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "4.23.0",
-        "@typescript-eslint/visitor-keys": "4.23.0",
-        "debug": "^4.1.1",
-        "globby": "^11.0.1",
-        "is-glob": "^4.0.1",
-        "semver": "^7.3.2",
-        "tsutils": "^3.17.1"
+        "@babel/helper-plugin-utils": "^7.8.0"
       },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-numeric-separator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.10.4"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-object-rest-spread": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
       },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
-      "version": "7.3.5",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+    "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
       "dev": true,
       "dependencies": {
-        "lru-cache": "^6.0.0"
+        "@babel/helper-plugin-utils": "^7.8.0"
       },
-      "bin": {
-        "semver": "bin/semver.js"
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-optional-chaining": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+      "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
       },
-      "engines": {
-        "node": ">=10"
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "4.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.23.0.tgz",
-      "integrity": "sha512-5PNe5cmX9pSifit0H+nPoQBXdbNzi5tOEec+3riK+ku4e3er37pKxMKDH5Ct5Y4fhWxcD4spnlYjxi9vXbSpwg==",
+    "node_modules/@babel/plugin-syntax-top-level-await": {
+      "version": "7.14.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+      "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "4.23.0",
-        "eslint-visitor-keys": "^2.0.0"
+        "@babel/helper-plugin-utils": "^7.14.5"
       },
       "engines": {
-        "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
+        "node": ">=6.9.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/acorn": {
-      "version": "7.4.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+    "node_modules/@babel/plugin-syntax-typescript": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz",
+      "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==",
       "dev": true,
-      "bin": {
-        "acorn": "bin/acorn"
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
-        "node": ">=0.4.0"
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/acorn-jsx": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
-      "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+    "node_modules/@babel/template": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz",
+      "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==",
       "dev": true,
-      "peerDependencies": {
-        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+      "dependencies": {
+        "@babel/code-frame": "^7.24.7",
+        "@babel/parser": "^7.24.7",
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
       }
     },
-    "node_modules/agent-base": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
-      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+    "node_modules/@babel/traverse": {
+      "version": "7.24.8",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz",
+      "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==",
       "dev": true,
       "dependencies": {
-        "debug": "4"
+        "@babel/code-frame": "^7.24.7",
+        "@babel/generator": "^7.24.8",
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-function-name": "^7.24.7",
+        "@babel/helper-hoist-variables": "^7.24.7",
+        "@babel/helper-split-export-declaration": "^7.24.7",
+        "@babel/parser": "^7.24.8",
+        "@babel/types": "^7.24.8",
+        "debug": "^4.3.1",
+        "globals": "^11.1.0"
       },
       "engines": {
-        "node": ">= 6.0.0"
+        "node": ">=6.9.0"
       }
     },
-    "node_modules/aggregate-error": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
-      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+    "node_modules/@babel/traverse/node_modules/globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/types": {
+      "version": "7.24.9",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz",
+      "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==",
       "dev": true,
       "dependencies": {
-        "clean-stack": "^2.0.0",
-        "indent-string": "^4.0.0"
+        "@babel/helper-string-parser": "^7.24.8",
+        "@babel/helper-validator-identifier": "^7.24.7",
+        "to-fast-properties": "^2.0.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=6.9.0"
       }
     },
-    "node_modules/ajv": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz",
-      "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==",
+    "node_modules/@bcoe/v8-coverage": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+      "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+      "dev": true
+    },
+    "node_modules/@cspotcode/source-map-support": {
+      "version": "0.8.1",
+      "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
+      "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+      "dev": true,
       "dependencies": {
-        "fast-deep-equal": "^3.1.1",
-        "json-schema-traverse": "^1.0.0",
-        "require-from-string": "^2.0.2",
-        "uri-js": "^4.2.2"
+        "@jridgewell/trace-mapping": "0.3.9"
       },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/epoberezkin"
+      "engines": {
+        "node": ">=12"
       }
     },
-    "node_modules/ansi-colors": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
-      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+    "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.9",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+      "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
       "dev": true,
-      "engines": {
-        "node": ">=6"
+      "dependencies": {
+        "@jridgewell/resolve-uri": "^3.0.3",
+        "@jridgewell/sourcemap-codec": "^1.4.10"
       }
     },
-    "node_modules/ansi-escapes": {
-      "version": "4.3.2",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
-      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+    "node_modules/@eslint-community/eslint-utils": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+      "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
       "dev": true,
       "dependencies": {
-        "type-fest": "^0.21.3"
+        "eslint-visitor-keys": "^3.3.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "peerDependencies": {
+        "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
       }
     },
-    "node_modules/ansi-escapes/node_modules/type-fest": {
-      "version": "0.21.3",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
-      "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+    "node_modules/@eslint-community/regexpp": {
+      "version": "4.11.0",
+      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz",
+      "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==",
       "dev": true,
       "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
       }
     },
-    "node_modules/ansi-regex": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-      "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+    "node_modules/@eslint/eslintrc": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+      "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
       "dev": true,
+      "dependencies": {
+        "ajv": "^6.12.4",
+        "debug": "^4.3.2",
+        "espree": "^9.6.0",
+        "globals": "^13.19.0",
+        "ignore": "^5.2.0",
+        "import-fresh": "^3.2.1",
+        "js-yaml": "^4.1.0",
+        "minimatch": "^3.1.2",
+        "strip-json-comments": "^3.1.1"
+      },
       "engines": {
-        "node": ">=8"
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
       }
     },
-    "node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+    "node_modules/@eslint/eslintrc/node_modules/ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
       "dev": true,
       "dependencies": {
-        "color-convert": "^1.9.0"
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
       },
-      "engines": {
-        "node": ">=4"
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
       }
     },
-    "node_modules/arg": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
-      "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
-      "dev": true
+    "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
     },
-    "node_modules/argparse": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+    "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true
     },
-    "node_modules/array-union": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
-      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+    "node_modules/@eslint/eslintrc/node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "dev": true,
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
       "engines": {
-        "node": ">=8"
+        "node": "*"
       }
     },
-    "node_modules/astral-regex": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-      "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+    "node_modules/@eslint/js": {
+      "version": "8.57.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+      "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
       "dev": true,
       "engines": {
-        "node": ">=8"
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       }
     },
-    "node_modules/asynckit": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
-      "dev": true
-    },
-    "node_modules/atob": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
-      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+    "node_modules/@humanwhocodes/config-array": {
+      "version": "0.11.14",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+      "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
+      "deprecated": "Use @eslint/config-array instead",
       "dev": true,
-      "bin": {
-        "atob": "bin/atob.js"
+      "dependencies": {
+        "@humanwhocodes/object-schema": "^2.0.2",
+        "debug": "^4.3.1",
+        "minimatch": "^3.0.5"
       },
       "engines": {
-        "node": ">= 4.5.0"
+        "node": ">=10.10.0"
       }
     },
-    "node_modules/balanced-match": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
-      "dev": true
-    },
-    "node_modules/brace-expansion": {
+    "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": {
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
@@ -787,1068 +812,1210 @@
         "concat-map": "0.0.1"
       }
     },
-    "node_modules/braces": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+    "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "dev": true,
       "dependencies": {
-        "fill-range": "^7.0.1"
+        "brace-expansion": "^1.1.7"
       },
       "engines": {
-        "node": ">=8"
+        "node": "*"
       }
     },
-    "node_modules/buffer-from": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
-      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
-      "dev": true
-    },
-    "node_modules/builtin-modules": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz",
-      "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==",
+    "node_modules/@humanwhocodes/module-importer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
       "dev": true,
       "engines": {
-        "node": ">=6"
+        "node": ">=12.22"
       },
       "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas"
       }
     },
-    "node_modules/call-me-maybe": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
-      "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+    "node_modules/@humanwhocodes/object-schema": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+      "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+      "deprecated": "Use @eslint/object-schema instead",
       "dev": true
     },
-    "node_modules/callsites": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
-      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+    "node_modules/@isaacs/cliui": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+      "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
       "dev": true,
       "dependencies": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
+        "string-width": "^5.1.2",
+        "string-width-cjs": "npm:string-width@^4.2.0",
+        "strip-ansi": "^7.0.1",
+        "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+        "wrap-ansi": "^8.1.0",
+        "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">=12"
       }
     },
-    "node_modules/clean-stack": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
-      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+    "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
       "dev": true,
       "engines": {
-        "node": ">=6"
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
       }
     },
-    "node_modules/cli-cursor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
-      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+    "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+      "dev": true,
+      "dependencies": {
+        "ansi-regex": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+      }
+    },
+    "node_modules/@istanbuljs/load-nyc-config": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+      "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
       "dev": true,
       "dependencies": {
-        "restore-cursor": "^3.1.0"
+        "camelcase": "^5.3.1",
+        "find-up": "^4.1.0",
+        "get-package-type": "^0.1.0",
+        "js-yaml": "^3.13.1",
+        "resolve-from": "^5.0.0"
       },
       "engines": {
         "node": ">=8"
       }
     },
-    "node_modules/cli-truncate": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
-      "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dev": true,
+      "dependencies": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
       "dev": true,
       "dependencies": {
-        "slice-ansi": "^3.0.0",
-        "string-width": "^4.2.0"
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
       },
       "engines": {
         "node": ">=8"
+      }
+    },
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+      "dev": true,
+      "dependencies": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
       }
     },
-    "node_modules/cli-truncate/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
       "dev": true,
       "dependencies": {
-        "color-convert": "^2.0.1"
+        "p-locate": "^4.1.0"
       },
       "engines": {
         "node": ">=8"
+      }
+    },
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "dev": true,
+      "dependencies": {
+        "p-try": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
       },
       "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/cli-truncate/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
       "dev": true,
       "dependencies": {
-        "color-name": "~1.1.4"
+        "p-limit": "^2.2.0"
       },
       "engines": {
-        "node": ">=7.0.0"
+        "node": ">=8"
       }
     },
-    "node_modules/cli-truncate/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
     },
-    "node_modules/cli-truncate/node_modules/slice-ansi": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
-      "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+    "node_modules/@istanbuljs/schema": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+      "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
       "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "astral-regex": "^2.0.0",
-        "is-fullwidth-code-point": "^3.0.0"
-      },
       "engines": {
         "node": ">=8"
       }
     },
-    "node_modules/cliui": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
-      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+    "node_modules/@jest/console": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
+      "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
       "dev": true,
       "dependencies": {
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.0",
-        "wrap-ansi": "^7.0.0"
+        "@jest/types": "^29.6.3",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "jest-message-util": "^29.7.0",
+        "jest-util": "^29.7.0",
+        "slash": "^3.0.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+    "node_modules/@jest/core": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz",
+      "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==",
       "dev": true,
       "dependencies": {
-        "color-name": "1.1.3"
+        "@jest/console": "^29.7.0",
+        "@jest/reporters": "^29.7.0",
+        "@jest/test-result": "^29.7.0",
+        "@jest/transform": "^29.7.0",
+        "@jest/types": "^29.6.3",
+        "@types/node": "*",
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^4.0.0",
+        "ci-info": "^3.2.0",
+        "exit": "^0.1.2",
+        "graceful-fs": "^4.2.9",
+        "jest-changed-files": "^29.7.0",
+        "jest-config": "^29.7.0",
+        "jest-haste-map": "^29.7.0",
+        "jest-message-util": "^29.7.0",
+        "jest-regex-util": "^29.6.3",
+        "jest-resolve": "^29.7.0",
+        "jest-resolve-dependencies": "^29.7.0",
+        "jest-runner": "^29.7.0",
+        "jest-runtime": "^29.7.0",
+        "jest-snapshot": "^29.7.0",
+        "jest-util": "^29.7.0",
+        "jest-validate": "^29.7.0",
+        "jest-watcher": "^29.7.0",
+        "micromatch": "^4.0.4",
+        "pretty-format": "^29.7.0",
+        "slash": "^3.0.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      },
+      "peerDependencies": {
+        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+      },
+      "peerDependenciesMeta": {
+        "node-notifier": {
+          "optional": true
+        }
       }
     },
-    "node_modules/color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-      "dev": true
-    },
-    "node_modules/combined-stream": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
-      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+    "node_modules/@jest/environment": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
+      "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
       "dev": true,
       "dependencies": {
-        "delayed-stream": "~1.0.0"
+        "@jest/fake-timers": "^29.7.0",
+        "@jest/types": "^29.6.3",
+        "@types/node": "*",
+        "jest-mock": "^29.7.0"
       },
       "engines": {
-        "node": ">= 0.8"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/commander": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
-      "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+    "node_modules/@jest/expect": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz",
+      "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==",
       "dev": true,
+      "dependencies": {
+        "expect": "^29.7.0",
+        "jest-snapshot": "^29.7.0"
+      },
       "engines": {
-        "node": ">= 10"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/commondir": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
-      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
-      "dev": true
-    },
-    "node_modules/concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
-    },
-    "node_modules/cosmiconfig": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
-      "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
+    "node_modules/@jest/expect-utils": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
+      "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
       "dev": true,
       "dependencies": {
-        "@types/parse-json": "^4.0.0",
-        "import-fresh": "^3.2.1",
-        "parse-json": "^5.0.0",
-        "path-type": "^4.0.0",
-        "yaml": "^1.10.0"
+        "jest-get-type": "^29.6.3"
       },
       "engines": {
-        "node": ">=10"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/create-require": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
-      "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
-      "dev": true
-    },
-    "node_modules/cross-fetch": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz",
-      "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==",
+    "node_modules/@jest/fake-timers": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
+      "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
       "dev": true,
       "dependencies": {
-        "node-fetch": "2.6.1"
+        "@jest/types": "^29.6.3",
+        "@sinonjs/fake-timers": "^10.0.2",
+        "@types/node": "*",
+        "jest-message-util": "^29.7.0",
+        "jest-mock": "^29.7.0",
+        "jest-util": "^29.7.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/cross-spawn": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+    "node_modules/@jest/globals": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz",
+      "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==",
       "dev": true,
       "dependencies": {
-        "path-key": "^3.1.0",
-        "shebang-command": "^2.0.0",
-        "which": "^2.0.1"
+        "@jest/environment": "^29.7.0",
+        "@jest/expect": "^29.7.0",
+        "@jest/types": "^29.6.3",
+        "jest-mock": "^29.7.0"
       },
       "engines": {
-        "node": ">= 8"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/debug": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
-      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+    "node_modules/@jest/reporters": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz",
+      "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==",
       "dev": true,
       "dependencies": {
-        "ms": "2.1.2"
+        "@bcoe/v8-coverage": "^0.2.3",
+        "@jest/console": "^29.7.0",
+        "@jest/test-result": "^29.7.0",
+        "@jest/transform": "^29.7.0",
+        "@jest/types": "^29.6.3",
+        "@jridgewell/trace-mapping": "^0.3.18",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "collect-v8-coverage": "^1.0.0",
+        "exit": "^0.1.2",
+        "glob": "^7.1.3",
+        "graceful-fs": "^4.2.9",
+        "istanbul-lib-coverage": "^3.0.0",
+        "istanbul-lib-instrument": "^6.0.0",
+        "istanbul-lib-report": "^3.0.0",
+        "istanbul-lib-source-maps": "^4.0.0",
+        "istanbul-reports": "^3.1.3",
+        "jest-message-util": "^29.7.0",
+        "jest-util": "^29.7.0",
+        "jest-worker": "^29.7.0",
+        "slash": "^3.0.0",
+        "string-length": "^4.0.1",
+        "strip-ansi": "^6.0.0",
+        "v8-to-istanbul": "^9.0.1"
       },
       "engines": {
-        "node": ">=6.0"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      },
+      "peerDependencies": {
+        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
       },
       "peerDependenciesMeta": {
-        "supports-color": {
+        "node-notifier": {
           "optional": true
         }
       }
     },
-    "node_modules/decode-uri-component": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+    "node_modules/@jest/reporters/node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "dev": true,
-      "engines": {
-        "node": ">=0.10"
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
       }
     },
-    "node_modules/dedent": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
-      "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
-      "dev": true
-    },
-    "node_modules/deep-is": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
-      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
-      "dev": true
-    },
-    "node_modules/deepmerge": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
-      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+    "node_modules/@jest/reporters/node_modules/glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
       "dev": true,
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
       "engines": {
-        "node": ">=0.10.0"
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "node_modules/delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+    "node_modules/@jest/reporters/node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "dev": true,
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
       "engines": {
-        "node": ">=0.4.0"
+        "node": "*"
       }
     },
-    "node_modules/diff": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
-      "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+    "node_modules/@jest/schemas": {
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+      "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
       "dev": true,
+      "dependencies": {
+        "@sinclair/typebox": "^0.27.8"
+      },
       "engines": {
-        "node": ">=0.3.1"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/dir-glob": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
-      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+    "node_modules/@jest/source-map": {
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz",
+      "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==",
       "dev": true,
       "dependencies": {
-        "path-type": "^4.0.0"
+        "@jridgewell/trace-mapping": "^0.3.18",
+        "callsites": "^3.0.0",
+        "graceful-fs": "^4.2.9"
       },
       "engines": {
-        "node": ">=8"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/doctrine": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
-      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+    "node_modules/@jest/test-result": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz",
+      "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==",
       "dev": true,
       "dependencies": {
-        "esutils": "^2.0.2"
+        "@jest/console": "^29.7.0",
+        "@jest/types": "^29.6.3",
+        "@types/istanbul-lib-coverage": "^2.0.0",
+        "collect-v8-coverage": "^1.0.0"
       },
       "engines": {
-        "node": ">=6.0.0"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/dtsgenerator": {
-      "version": "3.10.0",
-      "resolved": "https://registry.npmjs.org/dtsgenerator/-/dtsgenerator-3.10.0.tgz",
-      "integrity": "sha512-3MOlYOB7Y9OcWhbInWr3ndasfvwi8K5eB1SCQT3MsyeYFJ49j8ffFnGv09fz8hptOzvhDW0SzutB/HuMoaUP8w==",
+    "node_modules/@jest/test-sequencer": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz",
+      "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==",
       "dev": true,
       "dependencies": {
-        "commander": "^7.2.0",
-        "cross-fetch": "^3.1.4",
-        "debug": "^4.3.1",
-        "glob": "^7.1.6",
-        "https-proxy-agent": "^5.0.0",
-        "js-yaml": "^4.1.0",
-        "tslib": "^2.2.0",
-        "typescript": "^4.2.4"
-      },
-      "bin": {
-        "dtsgen": "bin/dtsgen"
+        "@jest/test-result": "^29.7.0",
+        "graceful-fs": "^4.2.9",
+        "jest-haste-map": "^29.7.0",
+        "slash": "^3.0.0"
       },
       "engines": {
-        "node": ">= 10.0"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
-    },
-    "node_modules/enquirer": {
-      "version": "2.3.6",
-      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
-      "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+    "node_modules/@jest/transform": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz",
+      "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==",
       "dev": true,
       "dependencies": {
-        "ansi-colors": "^4.1.1"
+        "@babel/core": "^7.11.6",
+        "@jest/types": "^29.6.3",
+        "@jridgewell/trace-mapping": "^0.3.18",
+        "babel-plugin-istanbul": "^6.1.1",
+        "chalk": "^4.0.0",
+        "convert-source-map": "^2.0.0",
+        "fast-json-stable-stringify": "^2.1.0",
+        "graceful-fs": "^4.2.9",
+        "jest-haste-map": "^29.7.0",
+        "jest-regex-util": "^29.6.3",
+        "jest-util": "^29.7.0",
+        "micromatch": "^4.0.4",
+        "pirates": "^4.0.4",
+        "slash": "^3.0.0",
+        "write-file-atomic": "^4.0.2"
       },
       "engines": {
-        "node": ">=8.6"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/error-ex": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
-      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+    "node_modules/@jest/types": {
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+      "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
       "dev": true,
       "dependencies": {
-        "is-arrayish": "^0.2.1"
+        "@jest/schemas": "^29.6.3",
+        "@types/istanbul-lib-coverage": "^2.0.0",
+        "@types/istanbul-reports": "^3.0.0",
+        "@types/node": "*",
+        "@types/yargs": "^17.0.8",
+        "chalk": "^4.0.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/escalade": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+    "node_modules/@jridgewell/gen-mapping": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+      "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
       "dev": true,
+      "dependencies": {
+        "@jridgewell/set-array": "^1.2.1",
+        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      },
       "engines": {
-        "node": ">=6"
+        "node": ">=6.0.0"
       }
     },
-    "node_modules/escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+    "node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
       "dev": true,
       "engines": {
-        "node": ">=0.8.0"
+        "node": ">=6.0.0"
       }
     },
-    "node_modules/eslint": {
-      "version": "7.26.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.26.0.tgz",
-      "integrity": "sha512-4R1ieRf52/izcZE7AlLy56uIHHDLT74Yzz2Iv2l6kDaYvEu9x+wMB5dZArVL8SYGXSYV2YAg70FcW5Y5nGGNIg==",
+    "node_modules/@jridgewell/set-array": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
       "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "7.12.11",
-        "@eslint/eslintrc": "^0.4.1",
-        "ajv": "^6.10.0",
-        "chalk": "^4.0.0",
-        "cross-spawn": "^7.0.2",
-        "debug": "^4.0.1",
-        "doctrine": "^3.0.0",
-        "enquirer": "^2.3.5",
-        "eslint-scope": "^5.1.1",
-        "eslint-utils": "^2.1.0",
-        "eslint-visitor-keys": "^2.0.0",
-        "espree": "^7.3.1",
-        "esquery": "^1.4.0",
-        "esutils": "^2.0.2",
-        "file-entry-cache": "^6.0.1",
-        "functional-red-black-tree": "^1.0.1",
-        "glob-parent": "^5.0.0",
-        "globals": "^13.6.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.0.0",
-        "imurmurhash": "^0.1.4",
-        "is-glob": "^4.0.0",
-        "js-yaml": "^3.13.1",
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "levn": "^0.4.1",
-        "lodash": "^4.17.21",
-        "minimatch": "^3.0.4",
-        "natural-compare": "^1.4.0",
-        "optionator": "^0.9.1",
-        "progress": "^2.0.0",
-        "regexpp": "^3.1.0",
-        "semver": "^7.2.1",
-        "strip-ansi": "^6.0.0",
-        "strip-json-comments": "^3.1.0",
-        "table": "^6.0.4",
-        "text-table": "^0.2.0",
-        "v8-compile-cache": "^2.0.3"
-      },
-      "bin": {
-        "eslint": "bin/eslint.js"
-      },
       "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
-    "node_modules/eslint-config-prettier": {
-      "version": "8.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz",
-      "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==",
-      "dev": true,
-      "bin": {
-        "eslint-config-prettier": "bin/cli.js"
-      },
-      "peerDependencies": {
-        "eslint": ">=7.0.0"
+        "node": ">=6.0.0"
       }
     },
-    "node_modules/eslint-plugin-prettier": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz",
-      "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==",
+    "node_modules/@jridgewell/source-map": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
+      "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
       "dev": true,
       "dependencies": {
-        "prettier-linter-helpers": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      },
-      "peerDependencies": {
-        "eslint": ">=5.0.0",
-        "prettier": ">=1.13.0"
-      },
-      "peerDependenciesMeta": {
-        "eslint-config-prettier": {
-          "optional": true
-        }
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.25"
       }
     },
-    "node_modules/eslint-scope": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
-      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+      "dev": true
+    },
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.25",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
       "dev": true,
       "dependencies": {
-        "esrecurse": "^4.3.0",
-        "estraverse": "^4.1.1"
-      },
-      "engines": {
-        "node": ">=8.0.0"
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
       }
     },
-    "node_modules/eslint-utils": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
-      "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+    "node_modules/@jsdevtools/ono": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz",
+      "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==",
+      "dev": true
+    },
+    "node_modules/@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
       "dev": true,
       "dependencies": {
-        "eslint-visitor-keys": "^1.1.0"
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
       },
       "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/mysticatea"
+        "node": ">= 8"
       }
     },
-    "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+    "node_modules/@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
       "dev": true,
       "engines": {
-        "node": ">=4"
+        "node": ">= 8"
       }
     },
-    "node_modules/eslint-visitor-keys": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
-      "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+    "node_modules/@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
       "dev": true,
+      "dependencies": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      },
       "engines": {
-        "node": ">=10"
+        "node": ">= 8"
       }
     },
-    "node_modules/eslint/node_modules/@babel/code-frame": {
-      "version": "7.12.11",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
-      "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+    "node_modules/@pkgjs/parseargs": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+      "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
       "dev": true,
-      "dependencies": {
-        "@babel/highlight": "^7.10.4"
+      "optional": true,
+      "engines": {
+        "node": ">=14"
       }
     },
-    "node_modules/eslint/node_modules/ajv": {
-      "version": "6.12.6",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+    "node_modules/@pkgr/core": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz",
+      "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
       "dev": true,
-      "dependencies": {
-        "fast-deep-equal": "^3.1.1",
-        "fast-json-stable-stringify": "^2.0.0",
-        "json-schema-traverse": "^0.4.1",
-        "uri-js": "^4.2.2"
+      "engines": {
+        "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
       },
       "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/epoberezkin"
+        "url": "https://opencollective.com/unts"
       }
     },
-    "node_modules/eslint/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+    "node_modules/@rollup/plugin-commonjs": {
+      "version": "26.0.1",
+      "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-26.0.1.tgz",
+      "integrity": "sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==",
       "dev": true,
       "dependencies": {
-        "color-convert": "^2.0.1"
+        "@rollup/pluginutils": "^5.0.1",
+        "commondir": "^1.0.1",
+        "estree-walker": "^2.0.2",
+        "glob": "^10.4.1",
+        "is-reference": "1.2.1",
+        "magic-string": "^0.30.3"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=16.0.0 || 14 >= 14.17"
       },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      "peerDependencies": {
+        "rollup": "^2.68.0||^3.0.0||^4.0.0"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
       }
     },
-    "node_modules/eslint/node_modules/argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+    "node_modules/@rollup/plugin-json": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz",
+      "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==",
       "dev": true,
       "dependencies": {
-        "sprintf-js": "~1.0.2"
+        "@rollup/pluginutils": "^5.1.0"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
       }
     },
-    "node_modules/eslint/node_modules/chalk": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
-      "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+    "node_modules/@rollup/plugin-node-resolve": {
+      "version": "15.2.3",
+      "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz",
+      "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==",
       "dev": true,
       "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
+        "@rollup/pluginutils": "^5.0.1",
+        "@types/resolve": "1.20.2",
+        "deepmerge": "^4.2.2",
+        "is-builtin-module": "^3.2.1",
+        "is-module": "^1.0.0",
+        "resolve": "^1.22.1"
       },
       "engines": {
-        "node": ">=10"
+        "node": ">=14.0.0"
       },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
+      "peerDependencies": {
+        "rollup": "^2.78.0||^3.0.0||^4.0.0"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
       }
     },
-    "node_modules/eslint/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+    "node_modules/@rollup/pluginutils": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
+      "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==",
       "dev": true,
       "dependencies": {
-        "color-name": "~1.1.4"
+        "@types/estree": "^1.0.0",
+        "estree-walker": "^2.0.2",
+        "picomatch": "^2.3.1"
       },
       "engines": {
-        "node": ">=7.0.0"
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
       }
     },
-    "node_modules/eslint/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+    "node_modules/@sinclair/typebox": {
+      "version": "0.27.8",
+      "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
+      "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
       "dev": true
     },
-    "node_modules/eslint/node_modules/has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+    "node_modules/@sinonjs/commons": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
+      "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
       "dev": true,
-      "engines": {
-        "node": ">=8"
+      "dependencies": {
+        "type-detect": "4.0.8"
       }
     },
-    "node_modules/eslint/node_modules/js-yaml": {
-      "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
-      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+    "node_modules/@sinonjs/fake-timers": {
+      "version": "10.3.0",
+      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
+      "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
       "dev": true,
       "dependencies": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
-      },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
+        "@sinonjs/commons": "^3.0.0"
       }
     },
-    "node_modules/eslint/node_modules/json-schema-traverse": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-      "dev": true
-    },
-    "node_modules/eslint/node_modules/semver": {
-      "version": "7.3.5",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+    "node_modules/@ts-morph/common": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.24.0.tgz",
+      "integrity": "sha512-c1xMmNHWpNselmpIqursHeOHHBTIsJLbB+NuovbTTRCNiTLEr/U9dbJ8qy0jd/O2x5pc3seWuOUN5R2IoOTp8A==",
       "dev": true,
       "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
+        "fast-glob": "^3.3.2",
+        "minimatch": "^9.0.4",
+        "mkdirp": "^3.0.1",
+        "path-browserify": "^1.0.1"
       }
     },
-    "node_modules/eslint/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+    "node_modules/@tsconfig/node10": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz",
+      "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==",
+      "dev": true
+    },
+    "node_modules/@tsconfig/node12": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
+      "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
+      "dev": true
+    },
+    "node_modules/@tsconfig/node14": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
+      "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
+      "dev": true
+    },
+    "node_modules/@tsconfig/node16": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
+      "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
+      "dev": true
+    },
+    "node_modules/@types/babel__core": {
+      "version": "7.20.5",
+      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+      "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
       "dev": true,
       "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
+        "@babel/parser": "^7.20.7",
+        "@babel/types": "^7.20.7",
+        "@types/babel__generator": "*",
+        "@types/babel__template": "*",
+        "@types/babel__traverse": "*"
       }
     },
-    "node_modules/espree": {
-      "version": "7.3.1",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
-      "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
+    "node_modules/@types/babel__generator": {
+      "version": "7.6.8",
+      "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
+      "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
       "dev": true,
       "dependencies": {
-        "acorn": "^7.4.0",
-        "acorn-jsx": "^5.3.1",
-        "eslint-visitor-keys": "^1.3.0"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
+        "@babel/types": "^7.0.0"
       }
     },
-    "node_modules/espree/node_modules/eslint-visitor-keys": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+    "node_modules/@types/babel__template": {
+      "version": "7.4.4",
+      "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+      "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
       "dev": true,
-      "engines": {
-        "node": ">=4"
+      "dependencies": {
+        "@babel/parser": "^7.1.0",
+        "@babel/types": "^7.0.0"
       }
     },
-    "node_modules/esprima": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+    "node_modules/@types/babel__traverse": {
+      "version": "7.20.6",
+      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
+      "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
       "dev": true,
-      "bin": {
-        "esparse": "bin/esparse.js",
-        "esvalidate": "bin/esvalidate.js"
-      },
-      "engines": {
-        "node": ">=4"
+      "dependencies": {
+        "@babel/types": "^7.20.7"
       }
     },
-    "node_modules/esquery": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
-      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+    "node_modules/@types/estree": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+      "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+      "dev": true
+    },
+    "node_modules/@types/graceful-fs": {
+      "version": "4.1.9",
+      "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
+      "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
       "dev": true,
       "dependencies": {
-        "estraverse": "^5.1.0"
-      },
-      "engines": {
-        "node": ">=0.10"
+        "@types/node": "*"
       }
     },
-    "node_modules/esquery/node_modules/estraverse": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
-      "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=4.0"
-      }
+    "node_modules/@types/istanbul-lib-coverage": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+      "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+      "dev": true
     },
-    "node_modules/esrecurse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
-      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+    "node_modules/@types/istanbul-lib-report": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+      "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
       "dev": true,
       "dependencies": {
-        "estraverse": "^5.2.0"
-      },
-      "engines": {
-        "node": ">=4.0"
+        "@types/istanbul-lib-coverage": "*"
       }
     },
-    "node_modules/esrecurse/node_modules/estraverse": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
-      "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+    "node_modules/@types/istanbul-reports": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+      "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
       "dev": true,
-      "engines": {
-        "node": ">=4.0"
+      "dependencies": {
+        "@types/istanbul-lib-report": "*"
       }
     },
-    "node_modules/estraverse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+    "node_modules/@types/jest": {
+      "version": "29.5.12",
+      "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz",
+      "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==",
       "dev": true,
-      "engines": {
-        "node": ">=4.0"
+      "dependencies": {
+        "expect": "^29.0.0",
+        "pretty-format": "^29.0.0"
       }
     },
-    "node_modules/estree-walker": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
-      "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
+    "node_modules/@types/js-yaml": {
+      "version": "4.0.9",
+      "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz",
+      "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==",
       "dev": true
     },
-    "node_modules/esutils": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+    "node_modules/@types/json-schema": {
+      "version": "7.0.15",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+      "dev": true
+    },
+    "node_modules/@types/lodash": {
+      "version": "4.17.10",
+      "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.10.tgz",
+      "integrity": "sha512-YpS0zzoduEhuOWjAotS6A5AVCva7X4lVlYLF0FYHAY9sdraBfnatttHItlWeZdGhuEkf+OzMNg2ZYAx8t+52uQ==",
+      "dev": true
+    },
+    "node_modules/@types/node": {
+      "version": "20.14.10",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz",
+      "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==",
       "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
+      "dependencies": {
+        "undici-types": "~5.26.4"
       }
     },
-    "node_modules/execa": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz",
-      "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==",
+    "node_modules/@types/node-fetch": {
+      "version": "2.6.11",
+      "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz",
+      "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==",
       "dev": true,
       "dependencies": {
-        "cross-spawn": "^7.0.3",
-        "get-stream": "^6.0.0",
-        "human-signals": "^2.1.0",
-        "is-stream": "^2.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^4.0.1",
-        "onetime": "^5.1.2",
-        "signal-exit": "^3.0.3",
-        "strip-final-newline": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/execa?sponsor=1"
+        "@types/node": "*",
+        "form-data": "^4.0.0"
       }
     },
-    "node_modules/fast-deep-equal": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
-    },
-    "node_modules/fast-diff": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
-      "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+    "node_modules/@types/resolve": {
+      "version": "1.20.2",
+      "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
+      "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
       "dev": true
     },
-    "node_modules/fast-glob": {
-      "version": "3.2.5",
-      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz",
-      "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==",
+    "node_modules/@types/rimraf": {
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-4.0.5.tgz",
+      "integrity": "sha512-DTCZoIQotB2SUJnYgrEx43cQIUYOlNZz0AZPbKU4PSLYTUdML5Gox0++z4F9kQocxStrCmRNhi4x5x/UlwtKUA==",
+      "deprecated": "This is a stub types definition. rimraf provides its own type definitions, so you do not need this installed.",
       "dev": true,
       "dependencies": {
-        "@nodelib/fs.stat": "^2.0.2",
-        "@nodelib/fs.walk": "^1.2.3",
-        "glob-parent": "^5.1.0",
-        "merge2": "^1.3.0",
-        "micromatch": "^4.0.2",
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8"
+        "rimraf": "*"
       }
     },
-    "node_modules/fast-json-stable-stringify": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
-      "dev": true
-    },
-    "node_modules/fast-levenshtein": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+    "node_modules/@types/stack-utils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
+      "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
       "dev": true
     },
-    "node_modules/fastq": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz",
-      "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==",
+    "node_modules/@types/yargs": {
+      "version": "17.0.32",
+      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz",
+      "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==",
       "dev": true,
       "dependencies": {
-        "reusify": "^1.0.4"
+        "@types/yargs-parser": "*"
       }
     },
-    "node_modules/figures": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
-      "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
-      "dev": true,
-      "dependencies": {
-        "escape-string-regexp": "^1.0.5"
+    "node_modules/@types/yargs-parser": {
+      "version": "21.0.3",
+      "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+      "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+      "dev": true
+    },
+    "node_modules/@typescript-eslint/eslint-plugin": {
+      "version": "7.16.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.1.tgz",
+      "integrity": "sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A==",
+      "dev": true,
+      "dependencies": {
+        "@eslint-community/regexpp": "^4.10.0",
+        "@typescript-eslint/scope-manager": "7.16.1",
+        "@typescript-eslint/type-utils": "7.16.1",
+        "@typescript-eslint/utils": "7.16.1",
+        "@typescript-eslint/visitor-keys": "7.16.1",
+        "graphemer": "^1.4.0",
+        "ignore": "^5.3.1",
+        "natural-compare": "^1.4.0",
+        "ts-api-utils": "^1.3.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": "^18.18.0 || >=20.0.0"
       },
       "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "@typescript-eslint/parser": "^7.0.0",
+        "eslint": "^8.56.0"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
       }
     },
-    "node_modules/file-entry-cache": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
-      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+    "node_modules/@typescript-eslint/parser": {
+      "version": "7.16.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.1.tgz",
+      "integrity": "sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA==",
       "dev": true,
       "dependencies": {
-        "flat-cache": "^3.0.4"
+        "@typescript-eslint/scope-manager": "7.16.1",
+        "@typescript-eslint/types": "7.16.1",
+        "@typescript-eslint/typescript-estree": "7.16.1",
+        "@typescript-eslint/visitor-keys": "7.16.1",
+        "debug": "^4.3.4"
       },
       "engines": {
-        "node": "^10.12.0 || >=12.0.0"
+        "node": "^18.18.0 || >=20.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^8.56.0"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
       }
     },
-    "node_modules/fill-range": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+    "node_modules/@typescript-eslint/scope-manager": {
+      "version": "7.16.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.1.tgz",
+      "integrity": "sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==",
       "dev": true,
       "dependencies": {
-        "to-regex-range": "^5.0.1"
+        "@typescript-eslint/types": "7.16.1",
+        "@typescript-eslint/visitor-keys": "7.16.1"
       },
       "engines": {
-        "node": ">=8"
+        "node": "^18.18.0 || >=20.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
       }
     },
-    "node_modules/find-cache-dir": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
-      "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
+    "node_modules/@typescript-eslint/type-utils": {
+      "version": "7.16.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.1.tgz",
+      "integrity": "sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==",
       "dev": true,
       "dependencies": {
-        "commondir": "^1.0.1",
-        "make-dir": "^3.0.2",
-        "pkg-dir": "^4.1.0"
+        "@typescript-eslint/typescript-estree": "7.16.1",
+        "@typescript-eslint/utils": "7.16.1",
+        "debug": "^4.3.4",
+        "ts-api-utils": "^1.3.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": "^18.18.0 || >=20.0.0"
       },
       "funding": {
-        "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^8.56.0"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
       }
     },
-    "node_modules/find-up": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+    "node_modules/@typescript-eslint/types": {
+      "version": "7.16.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.1.tgz",
+      "integrity": "sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==",
       "dev": true,
-      "dependencies": {
-        "locate-path": "^5.0.0",
-        "path-exists": "^4.0.0"
-      },
       "engines": {
-        "node": ">=8"
+        "node": "^18.18.0 || >=20.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
       }
     },
-    "node_modules/flat-cache": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
-      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+    "node_modules/@typescript-eslint/typescript-estree": {
+      "version": "7.16.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.1.tgz",
+      "integrity": "sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==",
       "dev": true,
       "dependencies": {
-        "flatted": "^3.1.0",
-        "rimraf": "^3.0.2"
+        "@typescript-eslint/types": "7.16.1",
+        "@typescript-eslint/visitor-keys": "7.16.1",
+        "debug": "^4.3.4",
+        "globby": "^11.1.0",
+        "is-glob": "^4.0.3",
+        "minimatch": "^9.0.4",
+        "semver": "^7.6.0",
+        "ts-api-utils": "^1.3.0"
       },
       "engines": {
-        "node": "^10.12.0 || >=12.0.0"
+        "node": "^18.18.0 || >=20.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
       }
     },
-    "node_modules/flatted": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
-      "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
-      "dev": true
-    },
-    "node_modules/form-data": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
-      "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
+    "node_modules/@typescript-eslint/utils": {
+      "version": "7.16.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.1.tgz",
+      "integrity": "sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==",
       "dev": true,
       "dependencies": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.8",
-        "mime-types": "^2.1.12"
+        "@eslint-community/eslint-utils": "^4.4.0",
+        "@typescript-eslint/scope-manager": "7.16.1",
+        "@typescript-eslint/types": "7.16.1",
+        "@typescript-eslint/typescript-estree": "7.16.1"
       },
       "engines": {
-        "node": ">= 6"
+        "node": "^18.18.0 || >=20.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^8.56.0"
       }
     },
-    "node_modules/fs-extra": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
-      "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+    "node_modules/@typescript-eslint/visitor-keys": {
+      "version": "7.16.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.1.tgz",
+      "integrity": "sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==",
       "dev": true,
       "dependencies": {
-        "graceful-fs": "^4.2.0",
-        "jsonfile": "^4.0.0",
-        "universalify": "^0.1.0"
+        "@typescript-eslint/types": "7.16.1",
+        "eslint-visitor-keys": "^3.4.3"
       },
       "engines": {
-        "node": ">=6 <7 || >=8"
+        "node": "^18.18.0 || >=20.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
       }
     },
-    "node_modules/fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+    "node_modules/@ungap/structured-clone": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
+      "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
       "dev": true
     },
-    "node_modules/fsevents": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
-      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+    "node_modules/acorn": {
+      "version": "8.12.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
+      "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
       "dev": true,
-      "hasInstallScript": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
+      "bin": {
+        "acorn": "bin/acorn"
+      },
       "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+        "node": ">=0.4.0"
       }
     },
-    "node_modules/function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
-    },
-    "node_modules/functional-red-black-tree": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
-      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
-      "dev": true
-    },
-    "node_modules/get-caller-file": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+    "node_modules/acorn-jsx": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
       "dev": true,
-      "engines": {
-        "node": "6.* || 8.* || >= 10.*"
+      "peerDependencies": {
+        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
       }
     },
-    "node_modules/get-own-enumerable-property-symbols": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
-      "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
-      "dev": true
-    },
-    "node_modules/get-stream": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+    "node_modules/acorn-walk": {
+      "version": "8.3.3",
+      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz",
+      "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==",
       "dev": true,
+      "dependencies": {
+        "acorn": "^8.11.0"
+      },
       "engines": {
-        "node": ">=10"
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/ajv": {
+      "version": "8.17.1",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+      "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+      "dependencies": {
+        "fast-deep-equal": "^3.1.3",
+        "fast-uri": "^3.0.1",
+        "json-schema-traverse": "^1.0.0",
+        "require-from-string": "^2.0.2"
       },
       "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
       }
     },
-    "node_modules/glob": {
-      "version": "7.1.6",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
-      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
-      "dev": true,
+    "node_modules/ajv-formats": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz",
+      "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==",
       "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
+        "ajv": "^8.0.0"
       },
-      "engines": {
-        "node": "*"
+      "peerDependencies": {
+        "ajv": "^8.0.0"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
+      "peerDependenciesMeta": {
+        "ajv": {
+          "optional": true
+        }
       }
     },
-    "node_modules/glob-parent": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
-      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+    "node_modules/ansi-escapes": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
       "dev": true,
       "dependencies": {
-        "is-glob": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/globals": {
-      "version": "13.8.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz",
-      "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==",
-      "dev": true,
-      "dependencies": {
-        "type-fest": "^0.20.2"
+        "type-fest": "^0.21.3"
       },
       "engines": {
         "node": ">=8"
@@ -1857,19 +2024,11 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/globby": {
-      "version": "11.0.3",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz",
-      "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==",
+    "node_modules/ansi-escapes/node_modules/type-fest": {
+      "version": "0.21.3",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+      "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
       "dev": true,
-      "dependencies": {
-        "array-union": "^2.1.0",
-        "dir-glob": "^3.0.1",
-        "fast-glob": "^3.1.1",
-        "ignore": "^5.1.4",
-        "merge2": "^1.3.0",
-        "slash": "^3.0.0"
-      },
       "engines": {
         "node": ">=10"
       },
@@ -1877,534 +2036,549 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/globby/node_modules/ignore": {
-      "version": "5.1.8",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
-      "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
+    "node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
       "dev": true,
       "engines": {
-        "node": ">= 4"
+        "node": ">=8"
       }
     },
-    "node_modules/graceful-fs": {
-      "version": "4.2.6",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
-      "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
-      "dev": true
-    },
-    "node_modules/has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+    "node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
       "dev": true,
       "dependencies": {
-        "function-bind": "^1.1.1"
+        "color-convert": "^2.0.1"
       },
       "engines": {
-        "node": ">= 0.4.0"
-      }
-    },
-    "node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
       }
     },
-    "node_modules/https-proxy-agent": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
-      "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
+    "node_modules/anymatch": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
       "dev": true,
       "dependencies": {
-        "agent-base": "6",
-        "debug": "4"
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
       },
       "engines": {
-        "node": ">= 6"
+        "node": ">= 8"
       }
     },
-    "node_modules/human-signals": {
+    "node_modules/arg": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+      "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+      "dev": true
+    },
+    "node_modules/argparse": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+    },
+    "node_modules/array-union": {
       "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
-      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
       "dev": true,
       "engines": {
-        "node": ">=10.17.0"
+        "node": ">=8"
       }
     },
-    "node_modules/husky": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/husky/-/husky-6.0.0.tgz",
-      "integrity": "sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ==",
+    "node_modules/async": {
+      "version": "3.2.5",
+      "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
+      "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==",
+      "dev": true
+    },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+      "dev": true
+    },
+    "node_modules/atob": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
       "dev": true,
       "bin": {
-        "husky": "lib/bin.js"
+        "atob": "bin/atob.js"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/typicode"
-      }
-    },
-    "node_modules/ignore": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
-      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
-      "dev": true,
       "engines": {
-        "node": ">= 4"
+        "node": ">= 4.5.0"
       }
     },
-    "node_modules/import-fresh": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
-      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+    "node_modules/babel-jest": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz",
+      "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==",
       "dev": true,
       "dependencies": {
-        "parent-module": "^1.0.0",
-        "resolve-from": "^4.0.0"
+        "@jest/transform": "^29.7.0",
+        "@types/babel__core": "^7.1.14",
+        "babel-plugin-istanbul": "^6.1.1",
+        "babel-preset-jest": "^29.6.3",
+        "chalk": "^4.0.0",
+        "graceful-fs": "^4.2.9",
+        "slash": "^3.0.0"
       },
       "engines": {
-        "node": ">=6"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "peerDependencies": {
+        "@babel/core": "^7.8.0"
       }
     },
-    "node_modules/imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+    "node_modules/babel-plugin-istanbul": {
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
+      "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
       "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@istanbuljs/load-nyc-config": "^1.0.0",
+        "@istanbuljs/schema": "^0.1.2",
+        "istanbul-lib-instrument": "^5.0.4",
+        "test-exclude": "^6.0.0"
+      },
       "engines": {
-        "node": ">=0.8.19"
+        "node": ">=8"
       }
     },
-    "node_modules/indent-string": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
-      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+    "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+      "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
       "dev": true,
+      "dependencies": {
+        "@babel/core": "^7.12.3",
+        "@babel/parser": "^7.14.7",
+        "@istanbuljs/schema": "^0.1.2",
+        "istanbul-lib-coverage": "^3.2.0",
+        "semver": "^6.3.0"
+      },
       "engines": {
         "node": ">=8"
       }
     },
-    "node_modules/inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+    "node_modules/babel-plugin-istanbul/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/babel-plugin-jest-hoist": {
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz",
+      "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==",
       "dev": true,
       "dependencies": {
-        "once": "^1.3.0",
-        "wrappy": "1"
+        "@babel/template": "^7.3.3",
+        "@babel/types": "^7.3.3",
+        "@types/babel__core": "^7.1.14",
+        "@types/babel__traverse": "^7.0.6"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true
+    "node_modules/babel-preset-current-node-syntax": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
+      "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/plugin-syntax-async-generators": "^7.8.4",
+        "@babel/plugin-syntax-bigint": "^7.8.3",
+        "@babel/plugin-syntax-class-properties": "^7.8.3",
+        "@babel/plugin-syntax-import-meta": "^7.8.3",
+        "@babel/plugin-syntax-json-strings": "^7.8.3",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+        "@babel/plugin-syntax-numeric-separator": "^7.8.3",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+        "@babel/plugin-syntax-top-level-await": "^7.8.3"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
     },
-    "node_modules/interpret": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
-      "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
+    "node_modules/babel-preset-jest": {
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz",
+      "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==",
       "dev": true,
+      "dependencies": {
+        "babel-plugin-jest-hoist": "^29.6.3",
+        "babel-preset-current-node-syntax": "^1.0.0"
+      },
       "engines": {
-        "node": ">= 0.10"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
       }
     },
-    "node_modules/is-arrayish": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
       "dev": true
     },
-    "node_modules/is-core-module": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.3.0.tgz",
-      "integrity": "sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw==",
+    "node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
       "dev": true,
       "dependencies": {
-        "has": "^1.0.3"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
+        "balanced-match": "^1.0.0"
       }
     },
-    "node_modules/is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+    "node_modules/braces": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
       "dev": true,
+      "dependencies": {
+        "fill-range": "^7.1.1"
+      },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=8"
       }
     },
-    "node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+    "node_modules/browserslist": {
+      "version": "4.23.2",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz",
+      "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==",
       "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "dependencies": {
+        "caniuse-lite": "^1.0.30001640",
+        "electron-to-chromium": "^1.4.820",
+        "node-releases": "^2.0.14",
+        "update-browserslist-db": "^1.1.0"
+      },
+      "bin": {
+        "browserslist": "cli.js"
+      },
       "engines": {
-        "node": ">=8"
+        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
       }
     },
-    "node_modules/is-glob": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
-      "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+    "node_modules/bs-logger": {
+      "version": "0.2.6",
+      "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz",
+      "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==",
       "dev": true,
       "dependencies": {
-        "is-extglob": "^2.1.1"
+        "fast-json-stable-stringify": "2.x"
       },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">= 6"
       }
     },
-    "node_modules/is-module": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
-      "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
+    "node_modules/bser": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+      "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+      "dev": true,
+      "dependencies": {
+        "node-int64": "^0.4.0"
+      }
+    },
+    "node_modules/buffer-from": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
       "dev": true
     },
-    "node_modules/is-number": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+    "node_modules/builtin-modules": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
+      "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
       "dev": true,
       "engines": {
-        "node": ">=0.12.0"
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/is-obj": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
-      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+    "node_modules/callsites": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
       "dev": true,
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=6"
       }
     },
-    "node_modules/is-reference": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
-      "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
+    "node_modules/camelcase": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
       "dev": true,
-      "dependencies": {
-        "@types/estree": "*"
+      "engines": {
+        "node": ">=6"
       }
     },
-    "node_modules/is-regexp": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
-      "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
+    "node_modules/caniuse-lite": {
+      "version": "1.0.30001642",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz",
+      "integrity": "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==",
       "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ]
     },
-    "node_modules/is-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
-      "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+    "node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
       "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
       "engines": {
-        "node": ">=8"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
       }
     },
-    "node_modules/is-unicode-supported": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
-      "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+    "node_modules/char-regex": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+      "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
       "dev": true,
       "engines": {
         "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "dev": true
-    },
-    "node_modules/jasmine": {
-      "version": "3.7.0",
-      "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.7.0.tgz",
-      "integrity": "sha512-wlzGQ+cIFzMEsI+wDqmOwvnjTvolLFwlcpYLCqSPPH0prOQaW3P+IzMhHYn934l1imNvw07oCyX+vGUv3wmtSQ==",
+    "node_modules/ci-info": {
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+      "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
       "dev": true,
-      "dependencies": {
-        "glob": "^7.1.6",
-        "jasmine-core": "~3.7.0"
-      },
-      "bin": {
-        "jasmine": "bin/jasmine.js"
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/sibiraj-s"
+        }
+      ],
+      "engines": {
+        "node": ">=8"
       }
     },
-    "node_modules/jasmine-core": {
-      "version": "3.7.1",
-      "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.7.1.tgz",
-      "integrity": "sha512-DH3oYDS/AUvvr22+xUBW62m1Xoy7tUlY1tsxKEJvl5JeJ7q8zd1K5bUwiOxdH+erj6l2vAMM3hV25Xs9/WrmuQ==",
+    "node_modules/cjs-module-lexer": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz",
+      "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==",
       "dev": true
     },
-    "node_modules/jest-worker": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
-      "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
-      "dev": true,
-      "dependencies": {
-        "@types/node": "*",
-        "merge-stream": "^2.0.0",
-        "supports-color": "^7.0.0"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      }
-    },
-    "node_modules/jest-worker/node_modules/has-flag": {
+    "node_modules/cli-cursor": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jest-worker/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz",
+      "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==",
       "dev": true,
       "dependencies": {
-        "has-flag": "^4.0.0"
+        "restore-cursor": "^4.0.0"
       },
       "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/js-tokens": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
-      "dev": true
-    },
-    "node_modules/js-yaml": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
-      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
-      "dependencies": {
-        "argparse": "^2.0.1"
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
       },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/json-parse-even-better-errors": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
-      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
-      "dev": true
-    },
-    "node_modules/json-schema-traverse": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
-      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
-    },
-    "node_modules/json-stable-stringify-without-jsonify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
-      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
-      "dev": true
-    },
-    "node_modules/jsonfile": {
+    "node_modules/cli-truncate": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
-      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
-      "dev": true,
-      "dependencies": {
-        "graceful-fs": "^4.1.6"
-      },
-      "optionalDependencies": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
-    "node_modules/levn": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
-      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+      "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz",
+      "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==",
       "dev": true,
       "dependencies": {
-        "prelude-ls": "^1.2.1",
-        "type-check": "~0.4.0"
+        "slice-ansi": "^5.0.0",
+        "string-width": "^7.0.0"
       },
       "engines": {
-        "node": ">= 0.8.0"
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/lines-and-columns": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
-      "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
-      "dev": true
-    },
-    "node_modules/lint-staged": {
-      "version": "11.0.0",
-      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.0.0.tgz",
-      "integrity": "sha512-3rsRIoyaE8IphSUtO1RVTFl1e0SLBtxxUOPBtHxQgBHS5/i6nqvjcUfNioMa4BU9yGnPzbO+xkfLtXtxBpCzjw==",
+    "node_modules/cli-truncate/node_modules/ansi-regex": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
       "dev": true,
-      "dependencies": {
-        "chalk": "^4.1.1",
-        "cli-truncate": "^2.1.0",
-        "commander": "^7.2.0",
-        "cosmiconfig": "^7.0.0",
-        "debug": "^4.3.1",
-        "dedent": "^0.7.0",
-        "enquirer": "^2.3.6",
-        "execa": "^5.0.0",
-        "listr2": "^3.8.2",
-        "log-symbols": "^4.1.0",
-        "micromatch": "^4.0.4",
-        "normalize-path": "^3.0.0",
-        "please-upgrade-node": "^3.2.0",
-        "string-argv": "0.3.1",
-        "stringify-object": "^3.3.0"
-      },
-      "bin": {
-        "lint-staged": "bin/lint-staged.js"
+      "engines": {
+        "node": ">=12"
       },
       "funding": {
-        "url": "https://opencollective.com/lint-staged"
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
       }
     },
-    "node_modules/lint-staged/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+    "node_modules/cli-truncate/node_modules/emoji-regex": {
+      "version": "10.3.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz",
+      "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==",
+      "dev": true
+    },
+    "node_modules/cli-truncate/node_modules/string-width": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+      "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
       "dev": true,
       "dependencies": {
-        "color-convert": "^2.0.1"
+        "emoji-regex": "^10.3.0",
+        "get-east-asian-width": "^1.0.0",
+        "strip-ansi": "^7.1.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=18"
       },
       "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/lint-staged/node_modules/chalk": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
-      "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+    "node_modules/cli-truncate/node_modules/strip-ansi": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
       "dev": true,
       "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
+        "ansi-regex": "^6.0.1"
       },
       "engines": {
-        "node": ">=10"
+        "node": ">=12"
       },
       "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
       }
     },
-    "node_modules/lint-staged/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+    "node_modules/cliui": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+      "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
       "dev": true,
       "dependencies": {
-        "color-name": "~1.1.4"
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.1",
+        "wrap-ansi": "^7.0.0"
       },
       "engines": {
-        "node": ">=7.0.0"
+        "node": ">=12"
       }
     },
-    "node_modules/lint-staged/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+    "node_modules/cliui/node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
       "dev": true
     },
-    "node_modules/lint-staged/node_modules/has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+    "node_modules/cliui/node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
       "dev": true,
       "engines": {
         "node": ">=8"
       }
     },
-    "node_modules/lint-staged/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+    "node_modules/cliui/node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
       "dev": true,
       "dependencies": {
-        "has-flag": "^4.0.0"
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
       },
       "engines": {
         "node": ">=8"
       }
     },
-    "node_modules/listr2": {
-      "version": "3.8.2",
-      "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.8.2.tgz",
-      "integrity": "sha512-E28Fw7Zd3HQlCJKzb9a8C8M0HtFWQeucE+S8YrSrqZObuCLPRHMRrR8gNmYt65cU9orXYHwvN5agXC36lYt7VQ==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^4.1.1",
-        "cli-truncate": "^2.1.0",
-        "figures": "^3.2.0",
-        "indent-string": "^4.0.0",
-        "log-update": "^4.0.0",
-        "p-map": "^4.0.0",
-        "rxjs": "^6.6.7",
-        "through": "^2.3.8",
-        "wrap-ansi": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      },
-      "peerDependencies": {
-        "enquirer": ">= 2.3.0 < 3"
-      }
-    },
-    "node_modules/listr2/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+    "node_modules/cliui/node_modules/wrap-ansi": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
       "dev": true,
       "dependencies": {
-        "color-convert": "^2.0.1"
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=10"
       },
       "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
       }
     },
-    "node_modules/listr2/node_modules/chalk": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
-      "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+    "node_modules/co": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+      "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
       "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
       "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
+        "iojs": ">= 1.0.0",
+        "node": ">= 0.12.0"
       }
     },
-    "node_modules/listr2/node_modules/color-convert": {
+    "node_modules/code-block-writer": {
+      "version": "13.0.1",
+      "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.1.tgz",
+      "integrity": "sha512-c5or4P6erEA69TxaxTNcHUNcIn+oyxSRTOWV+pSYF+z4epXqNvwvJ70XPGjPNgue83oAFAPBRQYwpAJ/Hpe/Sg==",
+      "dev": true
+    },
+    "node_modules/collect-v8-coverage": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz",
+      "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==",
+      "dev": true
+    },
+    "node_modules/color-convert": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
@@ -2416,740 +2590,866 @@
         "node": ">=7.0.0"
       }
     },
-    "node_modules/listr2/node_modules/color-name": {
+    "node_modules/color-name": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
       "dev": true
     },
-    "node_modules/listr2/node_modules/has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
+    "node_modules/colorette": {
+      "version": "2.0.20",
+      "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+      "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+      "dev": true
     },
-    "node_modules/listr2/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
       "dev": true,
       "dependencies": {
-        "has-flag": "^4.0.0"
+        "delayed-stream": "~1.0.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">= 0.8"
       }
     },
-    "node_modules/locate-path": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+    "node_modules/commander": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+      "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
       "dev": true,
-      "dependencies": {
-        "p-locate": "^4.1.0"
-      },
       "engines": {
-        "node": ">=8"
+        "node": ">=18"
       }
     },
-    "node_modules/lodash": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+    "node_modules/commondir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+      "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
       "dev": true
     },
-    "node_modules/lodash.clonedeep": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
-      "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
       "dev": true
     },
-    "node_modules/lodash.truncate": {
-      "version": "4.4.2",
-      "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
-      "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
+    "node_modules/convert-source-map": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
       "dev": true
     },
-    "node_modules/log-symbols": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
-      "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+    "node_modules/create-jest": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
+      "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==",
       "dev": true,
       "dependencies": {
-        "chalk": "^4.1.0",
-        "is-unicode-supported": "^0.1.0"
+        "@jest/types": "^29.6.3",
+        "chalk": "^4.0.0",
+        "exit": "^0.1.2",
+        "graceful-fs": "^4.2.9",
+        "jest-config": "^29.7.0",
+        "jest-util": "^29.7.0",
+        "prompts": "^2.0.1"
       },
-      "engines": {
-        "node": ">=10"
+      "bin": {
+        "create-jest": "bin/create-jest.js"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/log-symbols/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+    "node_modules/create-require": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+      "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+      "dev": true
+    },
+    "node_modules/cross-spawn": {
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
       },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      "engines": {
+        "node": ">= 8"
       }
     },
-    "node_modules/log-symbols/node_modules/chalk": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
-      "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+    "node_modules/data-uri-to-buffer": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
+      "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
+      "dev": true,
+      "engines": {
+        "node": ">= 12"
+      }
+    },
+    "node_modules/debug": {
+      "version": "4.3.5",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
+      "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
       "dev": true,
       "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
+        "ms": "2.1.2"
       },
       "engines": {
-        "node": ">=10"
+        "node": ">=6.0"
       },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
       }
     },
-    "node_modules/log-symbols/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+    "node_modules/decode-uri-component": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
+      "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
       "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
       "engines": {
-        "node": ">=7.0.0"
+        "node": ">=0.10"
       }
     },
-    "node_modules/log-symbols/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+    "node_modules/dedent": {
+      "version": "1.5.3",
+      "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz",
+      "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==",
+      "dev": true,
+      "peerDependencies": {
+        "babel-plugin-macros": "^3.1.0"
+      },
+      "peerDependenciesMeta": {
+        "babel-plugin-macros": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/deep-is": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
       "dev": true
     },
-    "node_modules/log-symbols/node_modules/has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+    "node_modules/deepmerge": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+      "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
       "dev": true,
       "engines": {
-        "node": ">=8"
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/log-symbols/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/detect-newline": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+      "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
       "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
       "engines": {
         "node": ">=8"
       }
     },
-    "node_modules/log-update": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
-      "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
+    "node_modules/diff": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+      "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
       "dev": true,
-      "dependencies": {
-        "ansi-escapes": "^4.3.0",
-        "cli-cursor": "^3.1.0",
-        "slice-ansi": "^4.0.0",
-        "wrap-ansi": "^6.2.0"
-      },
       "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "node": ">=0.3.1"
       }
     },
-    "node_modules/log-update/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+    "node_modules/diff-sequences": {
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
+      "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
+      "dev": true,
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/dir-glob": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
       "dev": true,
       "dependencies": {
-        "color-convert": "^2.0.1"
+        "path-type": "^4.0.0"
       },
       "engines": {
         "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
       }
     },
-    "node_modules/log-update/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+    "node_modules/doctrine": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
       "dev": true,
       "dependencies": {
-        "color-name": "~1.1.4"
+        "esutils": "^2.0.2"
       },
       "engines": {
-        "node": ">=7.0.0"
+        "node": ">=6.0.0"
       }
     },
-    "node_modules/log-update/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+    "node_modules/eastasianwidth": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
       "dev": true
     },
-    "node_modules/log-update/node_modules/wrap-ansi": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
-      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+    "node_modules/ejs": {
+      "version": "3.1.10",
+      "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+      "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
       "dev": true,
       "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
+        "jake": "^10.8.5"
+      },
+      "bin": {
+        "ejs": "bin/cli.js"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+    "node_modules/electron-to-chromium": {
+      "version": "1.4.828",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.828.tgz",
+      "integrity": "sha512-QOIJiWpQJDHAVO4P58pwb133Cwee0nbvy/MV1CwzZVGpkH1RX33N3vsaWRCpR6bF63AAq366neZrRTu7Qlsbbw==",
+      "dev": true
+    },
+    "node_modules/emittery": {
+      "version": "0.13.1",
+      "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
+      "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
       "dev": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
       "engines": {
-        "node": ">=10"
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/emittery?sponsor=1"
       }
     },
-    "node_modules/magic-string": {
-      "version": "0.25.7",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
-      "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
+    "node_modules/emoji-regex": {
+      "version": "9.2.2",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+      "dev": true
+    },
+    "node_modules/error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
       "dev": true,
       "dependencies": {
-        "sourcemap-codec": "^1.4.4"
+        "is-arrayish": "^0.2.1"
       }
     },
-    "node_modules/make-dir": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
-      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+    "node_modules/escalade": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+      "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
       "dev": true,
-      "dependencies": {
-        "semver": "^6.0.0"
-      },
       "engines": {
-        "node": ">=8"
+        "node": ">=6"
+      }
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/make-error": {
-      "version": "1.3.6",
-      "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
-      "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
-      "dev": true
-    },
-    "node_modules/merge-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
-      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
-      "dev": true
-    },
-    "node_modules/merge2": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
-      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
-      "dev": true,
+    "node_modules/eslint": {
+      "version": "8.57.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+      "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
+      "dev": true,
+      "dependencies": {
+        "@eslint-community/eslint-utils": "^4.2.0",
+        "@eslint-community/regexpp": "^4.6.1",
+        "@eslint/eslintrc": "^2.1.4",
+        "@eslint/js": "8.57.0",
+        "@humanwhocodes/config-array": "^0.11.14",
+        "@humanwhocodes/module-importer": "^1.0.1",
+        "@nodelib/fs.walk": "^1.2.8",
+        "@ungap/structured-clone": "^1.2.0",
+        "ajv": "^6.12.4",
+        "chalk": "^4.0.0",
+        "cross-spawn": "^7.0.2",
+        "debug": "^4.3.2",
+        "doctrine": "^3.0.0",
+        "escape-string-regexp": "^4.0.0",
+        "eslint-scope": "^7.2.2",
+        "eslint-visitor-keys": "^3.4.3",
+        "espree": "^9.6.1",
+        "esquery": "^1.4.2",
+        "esutils": "^2.0.2",
+        "fast-deep-equal": "^3.1.3",
+        "file-entry-cache": "^6.0.1",
+        "find-up": "^5.0.0",
+        "glob-parent": "^6.0.2",
+        "globals": "^13.19.0",
+        "graphemer": "^1.4.0",
+        "ignore": "^5.2.0",
+        "imurmurhash": "^0.1.4",
+        "is-glob": "^4.0.0",
+        "is-path-inside": "^3.0.3",
+        "js-yaml": "^4.1.0",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "levn": "^0.4.1",
+        "lodash.merge": "^4.6.2",
+        "minimatch": "^3.1.2",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.9.3",
+        "strip-ansi": "^6.0.1",
+        "text-table": "^0.2.0"
+      },
+      "bin": {
+        "eslint": "bin/eslint.js"
+      },
       "engines": {
-        "node": ">= 8"
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
       }
     },
-    "node_modules/micromatch": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
-      "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
+    "node_modules/eslint-config-prettier": {
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz",
+      "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==",
       "dev": true,
-      "dependencies": {
-        "braces": "^3.0.1",
-        "picomatch": "^2.2.3"
+      "bin": {
+        "eslint-config-prettier": "bin/cli.js"
       },
-      "engines": {
-        "node": ">=8.6"
+      "peerDependencies": {
+        "eslint": ">=7.0.0"
       }
     },
-    "node_modules/mime-db": {
-      "version": "1.47.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz",
-      "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==",
+    "node_modules/eslint-plugin-prettier": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz",
+      "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==",
       "dev": true,
+      "dependencies": {
+        "prettier-linter-helpers": "^1.0.0",
+        "synckit": "^0.8.6"
+      },
       "engines": {
-        "node": ">= 0.6"
+        "node": "^14.18.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint-plugin-prettier"
+      },
+      "peerDependencies": {
+        "@types/eslint": ">=8.0.0",
+        "eslint": ">=8.0.0",
+        "eslint-config-prettier": "*",
+        "prettier": ">=3.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/eslint": {
+          "optional": true
+        },
+        "eslint-config-prettier": {
+          "optional": true
+        }
       }
     },
-    "node_modules/mime-types": {
-      "version": "2.1.30",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz",
-      "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==",
+    "node_modules/eslint-scope": {
+      "version": "7.2.2",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+      "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
       "dev": true,
       "dependencies": {
-        "mime-db": "1.47.0"
+        "esrecurse": "^4.3.0",
+        "estraverse": "^5.2.0"
       },
       "engines": {
-        "node": ">= 0.6"
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
       }
     },
-    "node_modules/mimic-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+    "node_modules/eslint-visitor-keys": {
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+      "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
       "dev": true,
       "engines": {
-        "node": ">=6"
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
       }
     },
-    "node_modules/minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+    "node_modules/eslint/node_modules/ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
       "dev": true,
       "dependencies": {
-        "brace-expansion": "^1.1.7"
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
       },
-      "engines": {
-        "node": "*"
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
       }
     },
-    "node_modules/minimist": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-      "dev": true
-    },
-    "node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
+    "node_modules/eslint/node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
     },
-    "node_modules/natural-compare": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
-      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+    "node_modules/eslint/node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
       "dev": true
     },
-    "node_modules/node-fetch": {
-      "version": "2.6.1",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
-      "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
+    "node_modules/eslint/node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "dev": true,
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
       "engines": {
-        "node": "4.x || >=6.0.0"
+        "node": "*"
       }
     },
-    "node_modules/normalize-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+    "node_modules/espree": {
+      "version": "9.6.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+      "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
       "dev": true,
+      "dependencies": {
+        "acorn": "^8.9.0",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^3.4.1"
+      },
       "engines": {
-        "node": ">=0.10.0"
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
       }
     },
-    "node_modules/npm-run-path": {
+    "node_modules/esprima": {
       "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
       "dev": true,
-      "dependencies": {
-        "path-key": "^3.0.0"
+      "bin": {
+        "esparse": "bin/esparse.js",
+        "esvalidate": "bin/esvalidate.js"
       },
       "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
-      "dependencies": {
-        "wrappy": "1"
+        "node": ">=4"
       }
     },
-    "node_modules/onetime": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
-      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+    "node_modules/esquery": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+      "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
       "dev": true,
       "dependencies": {
-        "mimic-fn": "^2.1.0"
+        "estraverse": "^5.1.0"
       },
       "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "node": ">=0.10"
       }
     },
-    "node_modules/optionator": {
-      "version": "0.9.1",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
-      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+    "node_modules/esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
       "dev": true,
       "dependencies": {
-        "deep-is": "^0.1.3",
-        "fast-levenshtein": "^2.0.6",
-        "levn": "^0.4.1",
-        "prelude-ls": "^1.2.1",
-        "type-check": "^0.4.0",
-        "word-wrap": "^1.2.3"
+        "estraverse": "^5.2.0"
       },
       "engines": {
-        "node": ">= 0.8.0"
+        "node": ">=4.0"
       }
     },
-    "node_modules/p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+    "node_modules/estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
       "dev": true,
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
       "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "node": ">=4.0"
       }
     },
-    "node_modules/p-locate": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+    "node_modules/estree-walker": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+      "dev": true
+    },
+    "node_modules/esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
       "dev": true,
-      "dependencies": {
-        "p-limit": "^2.2.0"
-      },
       "engines": {
-        "node": ">=8"
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/p-map": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
-      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+    "node_modules/eventemitter3": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
+      "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
+      "dev": true
+    },
+    "node_modules/execa": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
       "dev": true,
       "dependencies": {
-        "aggregate-error": "^3.0.0"
+        "cross-spawn": "^7.0.3",
+        "get-stream": "^6.0.0",
+        "human-signals": "^2.1.0",
+        "is-stream": "^2.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^4.0.1",
+        "onetime": "^5.1.2",
+        "signal-exit": "^3.0.3",
+        "strip-final-newline": "^2.0.0"
       },
       "engines": {
         "node": ">=10"
       },
       "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "url": "https://github.com/sindresorhus/execa?sponsor=1"
       }
     },
-    "node_modules/p-try": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+    "node_modules/execa/node_modules/signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+      "dev": true
+    },
+    "node_modules/exit": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+      "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
       "dev": true,
       "engines": {
-        "node": ">=6"
+        "node": ">= 0.8.0"
       }
     },
-    "node_modules/parent-module": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
-      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+    "node_modules/expect": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
+      "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
       "dev": true,
       "dependencies": {
-        "callsites": "^3.0.0"
+        "@jest/expect-utils": "^29.7.0",
+        "jest-get-type": "^29.6.3",
+        "jest-matcher-utils": "^29.7.0",
+        "jest-message-util": "^29.7.0",
+        "jest-util": "^29.7.0"
       },
       "engines": {
-        "node": ">=6"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/parse-json": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
-      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+    "node_modules/fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+    },
+    "node_modules/fast-diff": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
+      "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
+      "dev": true
+    },
+    "node_modules/fast-glob": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+      "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
       "dev": true,
       "dependencies": {
-        "@babel/code-frame": "^7.0.0",
-        "error-ex": "^1.3.1",
-        "json-parse-even-better-errors": "^2.3.0",
-        "lines-and-columns": "^1.1.6"
-      },
-      "engines": {
-        "node": ">=8"
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.2",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.4"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/path-exists": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-      "dev": true,
       "engines": {
-        "node": ">=8"
+        "node": ">=8.6.0"
       }
     },
-    "node_modules/path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+    "node_modules/fast-glob/node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
       "dev": true,
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">= 6"
       }
     },
-    "node_modules/path-key": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
+    "node_modules/fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true
     },
-    "node_modules/path-parse": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+    "node_modules/fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
       "dev": true
     },
-    "node_modules/path-type": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+    "node_modules/fast-uri": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz",
+      "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw=="
+    },
+    "node_modules/fastq": {
+      "version": "1.17.1",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
+      "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
       "dev": true,
-      "engines": {
-        "node": ">=8"
+      "dependencies": {
+        "reusify": "^1.0.4"
       }
     },
-    "node_modules/picomatch": {
-      "version": "2.2.3",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz",
-      "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==",
+    "node_modules/fb-watchman": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+      "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
       "dev": true,
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
+      "dependencies": {
+        "bser": "2.1.1"
       }
     },
-    "node_modules/pkg-dir": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
-      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+    "node_modules/fetch-blob": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+      "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
       "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/jimmywarting"
+        },
+        {
+          "type": "paypal",
+          "url": "https://paypal.me/jimmywarting"
+        }
+      ],
       "dependencies": {
-        "find-up": "^4.0.0"
+        "node-domexception": "^1.0.0",
+        "web-streams-polyfill": "^3.0.3"
       },
       "engines": {
-        "node": ">=8"
+        "node": "^12.20 || >= 14.13"
       }
     },
-    "node_modules/please-upgrade-node": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz",
-      "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==",
+    "node_modules/file-entry-cache": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
       "dev": true,
       "dependencies": {
-        "semver-compare": "^1.0.0"
-      }
-    },
-    "node_modules/prelude-ls": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
-      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/prettier": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.0.tgz",
-      "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==",
-      "dev": true,
-      "bin": {
-        "prettier": "bin-prettier.js"
+        "flat-cache": "^3.0.4"
       },
       "engines": {
-        "node": ">=10.13.0"
+        "node": "^10.12.0 || >=12.0.0"
       }
     },
-    "node_modules/prettier-linter-helpers": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
-      "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+    "node_modules/filelist": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+      "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
       "dev": true,
       "dependencies": {
-        "fast-diff": "^1.1.2"
-      },
-      "engines": {
-        "node": ">=6.0.0"
+        "minimatch": "^5.0.1"
       }
     },
-    "node_modules/progress": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
-      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+    "node_modules/filelist/node_modules/minimatch": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
       "dev": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
       "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/punycode": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
-      "engines": {
-        "node": ">=6"
+        "node": ">=10"
       }
     },
-    "node_modules/queue-microtask": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
-      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/randombytes": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
-      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+    "node_modules/fill-range": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
       "dev": true,
       "dependencies": {
-        "safe-buffer": "^5.1.0"
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "node_modules/rechoir": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
-      "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+    "node_modules/find-cache-dir": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+      "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
       "dev": true,
       "dependencies": {
-        "resolve": "^1.1.6"
+        "commondir": "^1.0.1",
+        "make-dir": "^3.0.2",
+        "pkg-dir": "^4.1.0"
       },
       "engines": {
-        "node": ">= 0.10"
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
       }
     },
-    "node_modules/regexpp": {
+    "node_modules/find-cache-dir/node_modules/make-dir": {
       "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
-      "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
       "dev": true,
+      "dependencies": {
+        "semver": "^6.0.0"
+      },
       "engines": {
         "node": ">=8"
       },
       "funding": {
-        "url": "https://github.com/sponsors/mysticatea"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/require-directory": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+    "node_modules/find-cache-dir/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
       "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
+      "bin": {
+        "semver": "bin/semver.js"
       }
     },
-    "node_modules/require-from-string": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
-      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+    "node_modules/find-up": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+      "dev": true,
+      "dependencies": {
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
+      },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/resolve": {
-      "version": "1.20.0",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
-      "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+    "node_modules/flat-cache": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+      "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
       "dev": true,
       "dependencies": {
-        "is-core-module": "^2.2.0",
-        "path-parse": "^1.0.6"
+        "flatted": "^3.2.9",
+        "keyv": "^4.5.3",
+        "rimraf": "^3.0.2"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
       }
     },
-    "node_modules/resolve-from": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+    "node_modules/flat-cache/node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "dev": true,
-      "engines": {
-        "node": ">=4"
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
       }
     },
-    "node_modules/restore-cursor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
-      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+    "node_modules/flat-cache/node_modules/glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
       "dev": true,
       "dependencies": {
-        "onetime": "^5.1.0",
-        "signal-exit": "^3.0.2"
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "node_modules/reusify": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
-      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+    "node_modules/flat-cache/node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "dev": true,
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
       "engines": {
-        "iojs": ">=1.0.0",
-        "node": ">=0.10.0"
+        "node": "*"
       }
     },
-    "node_modules/rimraf": {
+    "node_modules/flat-cache/node_modules/rimraf": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
       "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "deprecated": "Rimraf versions prior to v4 are no longer supported",
       "dev": true,
       "dependencies": {
         "glob": "^7.1.3"
@@ -3161,423 +3461,315 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "node_modules/rollup": {
-      "version": "2.47.0",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.47.0.tgz",
-      "integrity": "sha512-rqBjgq9hQfW0vRmz+0S062ORRNJXvwRpzxhFXORvar/maZqY6za3rgQ/p1Glg+j1hnc1GtYyQCPiAei95uTElg==",
-      "dev": true,
-      "dependencies": {
-        "fsevents": "~2.3.1"
-      },
-      "bin": {
-        "rollup": "dist/bin/rollup"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.1"
-      }
+    "node_modules/flatted": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
+      "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
+      "dev": true
     },
-    "node_modules/rollup-plugin-sourcemaps": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.6.3.tgz",
-      "integrity": "sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==",
+    "node_modules/foreground-child": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz",
+      "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==",
       "dev": true,
       "dependencies": {
-        "@rollup/pluginutils": "^3.0.9",
-        "source-map-resolve": "^0.6.0"
+        "cross-spawn": "^7.0.0",
+        "signal-exit": "^4.0.1"
       },
       "engines": {
-        "node": ">=10.0.0"
-      },
-      "peerDependencies": {
-        "@types/node": ">=10.0.0",
-        "rollup": ">=0.31.2"
+        "node": ">=14"
       },
-      "peerDependenciesMeta": {
-        "@types/node": {
-          "optional": true
-        }
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "node_modules/rollup-plugin-terser": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
-      "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
+    "node_modules/form-data": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
       "dev": true,
       "dependencies": {
-        "@babel/code-frame": "^7.10.4",
-        "jest-worker": "^26.2.1",
-        "serialize-javascript": "^4.0.0",
-        "terser": "^5.0.0"
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
       },
-      "peerDependencies": {
-        "rollup": "^2.0.0"
+      "engines": {
+        "node": ">= 6"
       }
     },
-    "node_modules/rollup-plugin-typescript2": {
-      "version": "0.30.0",
-      "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.30.0.tgz",
-      "integrity": "sha512-NUFszIQyhgDdhRS9ya/VEmsnpTe+GERDMmFo0Y+kf8ds51Xy57nPNGglJY+W6x1vcouA7Au7nsTgsLFj2I0PxQ==",
+    "node_modules/formdata-polyfill": {
+      "version": "4.0.10",
+      "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+      "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
       "dev": true,
       "dependencies": {
-        "@rollup/pluginutils": "^4.1.0",
-        "find-cache-dir": "^3.3.1",
-        "fs-extra": "8.1.0",
-        "resolve": "1.20.0",
-        "tslib": "2.1.0"
+        "fetch-blob": "^3.1.2"
       },
-      "peerDependencies": {
-        "rollup": ">=1.26.3",
-        "typescript": ">=2.4.0"
+      "engines": {
+        "node": ">=12.20.0"
       }
     },
-    "node_modules/rollup-plugin-typescript2/node_modules/@rollup/pluginutils": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.0.tgz",
-      "integrity": "sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ==",
+    "node_modules/fs-extra": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+      "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
       "dev": true,
       "dependencies": {
-        "estree-walker": "^2.0.1",
-        "picomatch": "^2.2.2"
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
       },
       "engines": {
-        "node": ">= 8.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^1.20.0||^2.0.0"
+        "node": ">=12"
       }
     },
-    "node_modules/rollup-plugin-typescript2/node_modules/estree-walker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
-      "dev": true
-    },
-    "node_modules/rollup-plugin-typescript2/node_modules/tslib": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
-      "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==",
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
       "dev": true
     },
-    "node_modules/run-parallel": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
-      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+    "node_modules/fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
       "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
+      "hasInstallScript": true,
+      "optional": true,
+      "os": [
+        "darwin"
       ],
-      "dependencies": {
-        "queue-microtask": "^1.2.2"
-      }
-    },
-    "node_modules/rxjs": {
-      "version": "6.6.7",
-      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
-      "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
-      "dev": true,
-      "dependencies": {
-        "tslib": "^1.9.0"
-      },
       "engines": {
-        "npm": ">=2.0.0"
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
       }
     },
-    "node_modules/rxjs/node_modules/tslib": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-      "dev": true
-    },
-    "node_modules/safe-buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+    "node_modules/function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
       "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
     },
-    "node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+    "node_modules/gensync": {
+      "version": "1.0.0-beta.2",
+      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
       "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
+      "engines": {
+        "node": ">=6.9.0"
       }
     },
-    "node_modules/semver-compare": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
-      "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
-      "dev": true
-    },
-    "node_modules/serialize-javascript": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
-      "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+    "node_modules/get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
       "dev": true,
-      "dependencies": {
-        "randombytes": "^2.1.0"
+      "engines": {
+        "node": "6.* || 8.* || >= 10.*"
       }
     },
-    "node_modules/shebang-command": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+    "node_modules/get-east-asian-width": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz",
+      "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==",
       "dev": true,
-      "dependencies": {
-        "shebang-regex": "^3.0.0"
-      },
       "engines": {
-        "node": ">=8"
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/shebang-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+    "node_modules/get-package-type": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+      "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
       "dev": true,
       "engines": {
-        "node": ">=8"
+        "node": ">=8.0.0"
       }
     },
-    "node_modules/shelljs": {
-      "version": "0.8.4",
-      "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz",
-      "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==",
+    "node_modules/get-stream": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
       "dev": true,
-      "dependencies": {
-        "glob": "^7.0.0",
-        "interpret": "^1.0.0",
-        "rechoir": "^0.6.2"
-      },
-      "bin": {
-        "shjs": "bin/shjs"
-      },
       "engines": {
-        "node": ">=4"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/shx": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.3.tgz",
-      "integrity": "sha512-nZJ3HFWVoTSyyB+evEKjJ1STiixGztlqwKLTUNV5KqMWtGey9fTd4KU1gdZ1X9BV6215pswQ/Jew9NsuS/fNDA==",
+    "node_modules/glob": {
+      "version": "10.4.5",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+      "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
       "dev": true,
       "dependencies": {
-        "minimist": "^1.2.3",
-        "shelljs": "^0.8.4"
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^3.1.2",
+        "minimatch": "^9.0.4",
+        "minipass": "^7.1.2",
+        "package-json-from-dist": "^1.0.0",
+        "path-scurry": "^1.11.1"
       },
       "bin": {
-        "shx": "lib/cli.js"
+        "glob": "dist/esm/bin.mjs"
       },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/signal-exit": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
-      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
-      "dev": true
-    },
-    "node_modules/slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "node_modules/slice-ansi": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
-      "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+    "node_modules/glob-parent": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
       "dev": true,
       "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "astral-regex": "^2.0.0",
-        "is-fullwidth-code-point": "^3.0.0"
+        "is-glob": "^4.0.3"
       },
       "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+        "node": ">=10.13.0"
       }
     },
-    "node_modules/slice-ansi/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+    "node_modules/globals": {
+      "version": "13.24.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+      "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
       "dev": true,
       "dependencies": {
-        "color-convert": "^2.0.1"
+        "type-fest": "^0.20.2"
       },
       "engines": {
         "node": ">=8"
       },
       "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/slice-ansi/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+    "node_modules/globby": {
+      "version": "11.1.0",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+      "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
       "dev": true,
       "dependencies": {
-        "color-name": "~1.1.4"
+        "array-union": "^2.1.0",
+        "dir-glob": "^3.0.1",
+        "fast-glob": "^3.2.9",
+        "ignore": "^5.2.0",
+        "merge2": "^1.4.1",
+        "slash": "^3.0.0"
       },
       "engines": {
-        "node": ">=7.0.0"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/slice-ansi/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+    "node_modules/graceful-fs": {
+      "version": "4.2.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
       "dev": true
     },
-    "node_modules/source-map": {
-      "version": "0.7.3",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
-      "dev": true,
-      "engines": {
-        "node": ">= 8"
-      }
+    "node_modules/graphemer": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+      "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+      "dev": true
     },
-    "node_modules/source-map-resolve": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz",
-      "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==",
+    "node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
       "dev": true,
-      "dependencies": {
-        "atob": "^2.1.2",
-        "decode-uri-component": "^0.2.0"
+      "engines": {
+        "node": ">=8"
       }
     },
-    "node_modules/source-map-support": {
-      "version": "0.5.19",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
-      "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+    "node_modules/hasown": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
       "dev": true,
       "dependencies": {
-        "buffer-from": "^1.0.0",
-        "source-map": "^0.6.0"
-      }
-    },
-    "node_modules/source-map-support/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true,
+        "function-bind": "^1.1.2"
+      },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">= 0.4"
       }
     },
-    "node_modules/sourcemap-codec": {
-      "version": "1.4.8",
-      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
-      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
-      "dev": true
-    },
-    "node_modules/sprintf-js": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+    "node_modules/html-escaper": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+      "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
       "dev": true
     },
-    "node_modules/string-argv": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
-      "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==",
+    "node_modules/human-signals": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
       "dev": true,
       "engines": {
-        "node": ">=0.6.19"
+        "node": ">=10.17.0"
       }
     },
-    "node_modules/string-width": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
-      "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+    "node_modules/husky": {
+      "version": "9.0.11",
+      "resolved": "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz",
+      "integrity": "sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==",
       "dev": true,
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.0"
+      "bin": {
+        "husky": "bin.mjs"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/typicode"
       }
     },
-    "node_modules/stringify-object": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
-      "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+    "node_modules/ignore": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
+      "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
       "dev": true,
-      "dependencies": {
-        "get-own-enumerable-property-symbols": "^3.0.0",
-        "is-obj": "^1.0.1",
-        "is-regexp": "^1.0.0"
-      },
       "engines": {
-        "node": ">=4"
+        "node": ">= 4"
       }
     },
-    "node_modules/strip-ansi": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-      "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+    "node_modules/import-fresh": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
       "dev": true,
       "dependencies": {
-        "ansi-regex": "^5.0.0"
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
       },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/strip-final-newline": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
-      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
-      "dev": true,
       "engines": {
         "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/strip-json-comments": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
-      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+    "node_modules/import-local": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+      "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
       "dev": true,
+      "dependencies": {
+        "pkg-dir": "^4.2.0",
+        "resolve-cwd": "^3.0.0"
+      },
+      "bin": {
+        "import-local-fixture": "fixtures/cli.js"
+      },
       "engines": {
         "node": ">=8"
       },
@@ -3585,3215 +3777,3637 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+    "node_modules/imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
       "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
       "engines": {
-        "node": ">=4"
+        "node": ">=0.8.19"
       }
     },
-    "node_modules/table": {
-      "version": "6.7.1",
-      "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz",
-      "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==",
+    "node_modules/inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
       "dev": true,
       "dependencies": {
-        "ajv": "^8.0.1",
-        "lodash.clonedeep": "^4.5.0",
-        "lodash.truncate": "^4.4.2",
-        "slice-ansi": "^4.0.0",
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=10.0.0"
+        "once": "^1.3.0",
+        "wrappy": "1"
       }
     },
-    "node_modules/terser": {
-      "version": "5.7.0",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.0.tgz",
-      "integrity": "sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g==",
-      "dev": true,
-      "dependencies": {
-        "commander": "^2.20.0",
-        "source-map": "~0.7.2",
-        "source-map-support": "~0.5.19"
-      },
-      "bin": {
-        "terser": "bin/terser"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/terser/node_modules/commander": {
-      "version": "2.20.3",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-      "dev": true
-    },
-    "node_modules/text-table": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
-      "dev": true
-    },
-    "node_modules/through": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
       "dev": true
     },
-    "node_modules/to-regex-range": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+    "node_modules/interpret": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
+      "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
       "dev": true,
-      "dependencies": {
-        "is-number": "^7.0.0"
-      },
       "engines": {
-        "node": ">=8.0"
+        "node": ">= 0.10"
       }
     },
-    "node_modules/ts-node": {
-      "version": "9.1.1",
-      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz",
-      "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==",
+    "node_modules/is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+      "dev": true
+    },
+    "node_modules/is-builtin-module": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz",
+      "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==",
       "dev": true,
       "dependencies": {
-        "arg": "^4.1.0",
-        "create-require": "^1.1.0",
-        "diff": "^4.0.1",
-        "make-error": "^1.1.1",
-        "source-map-support": "^0.5.17",
-        "yn": "3.1.1"
-      },
-      "bin": {
-        "ts-node": "dist/bin.js",
-        "ts-node-script": "dist/bin-script.js",
-        "ts-node-transpile-only": "dist/bin-transpile.js",
-        "ts-script": "dist/bin-script-deprecated.js"
+        "builtin-modules": "^3.3.0"
       },
       "engines": {
-        "node": ">=10.0.0"
+        "node": ">=6"
       },
-      "peerDependencies": {
-        "typescript": ">=2.7"
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/tslib": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz",
-      "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==",
-      "dev": true
-    },
-    "node_modules/tsutils": {
-      "version": "3.21.0",
-      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
-      "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+    "node_modules/is-core-module": {
+      "version": "2.14.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz",
+      "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==",
       "dev": true,
       "dependencies": {
-        "tslib": "^1.8.1"
+        "hasown": "^2.0.2"
       },
       "engines": {
-        "node": ">= 6"
+        "node": ">= 0.4"
       },
-      "peerDependencies": {
-        "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/tsutils/node_modules/tslib": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-      "dev": true
-    },
-    "node_modules/type-check": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
-      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
       "dev": true,
-      "dependencies": {
-        "prelude-ls": "^1.2.1"
-      },
       "engines": {
-        "node": ">= 0.8.0"
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/type-fest": {
-      "version": "0.20.2",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
-      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+    "node_modules/is-fullwidth-code-point": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
+      "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
       "dev": true,
       "engines": {
-        "node": ">=10"
+        "node": ">=12"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/typescript": {
-      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz",
-      "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==",
+    "node_modules/is-generator-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+      "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
       "dev": true,
-      "bin": {
-        "tsc": "bin/tsc",
-        "tsserver": "bin/tsserver"
-      },
       "engines": {
-        "node": ">=4.2.0"
+        "node": ">=6"
       }
     },
-    "node_modules/universalify": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
       "dev": true,
-      "engines": {
-        "node": ">= 4.0.0"
-      }
-    },
-    "node_modules/uri-js": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
-      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
       "dependencies": {
-        "punycode": "^2.1.0"
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/v8-compile-cache": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
-      "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+    "node_modules/is-module": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
+      "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
       "dev": true
     },
-    "node_modules/which": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+    "node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
       "dev": true,
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "node-which": "bin/node-which"
-      },
       "engines": {
-        "node": ">= 8"
+        "node": ">=0.12.0"
       }
     },
-    "node_modules/word-wrap": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
-      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+    "node_modules/is-path-inside": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
       "dev": true,
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=8"
       }
     },
-    "node_modules/wrap-ansi": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
-      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+    "node_modules/is-reference": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
+      "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
       "dev": true,
       "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+        "@types/estree": "*"
       }
     },
-    "node_modules/wrap-ansi/node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+    "node_modules/is-stream": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
       "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
       "engines": {
         "node": ">=8"
       },
       "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/wrap-ansi/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
       "dev": true
     },
-    "node_modules/y18n": {
-      "version": "5.0.8",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
-      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+    "node_modules/istanbul-lib-coverage": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+      "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
       "dev": true,
       "engines": {
-        "node": ">=10"
+        "node": ">=8"
       }
     },
-    "node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
-    "node_modules/yaml": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
-      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+    "node_modules/istanbul-lib-instrument": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz",
+      "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==",
       "dev": true,
+      "dependencies": {
+        "@babel/core": "^7.23.9",
+        "@babel/parser": "^7.23.9",
+        "@istanbuljs/schema": "^0.1.3",
+        "istanbul-lib-coverage": "^3.2.0",
+        "semver": "^7.5.4"
+      },
       "engines": {
-        "node": ">= 6"
+        "node": ">=10"
       }
     },
-    "node_modules/yargs": {
-      "version": "17.0.1",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.0.1.tgz",
-      "integrity": "sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==",
+    "node_modules/istanbul-lib-report": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+      "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
       "dev": true,
       "dependencies": {
-        "cliui": "^7.0.2",
-        "escalade": "^3.1.1",
-        "get-caller-file": "^2.0.5",
-        "require-directory": "^2.1.1",
-        "string-width": "^4.2.0",
-        "y18n": "^5.0.5",
-        "yargs-parser": "^20.2.2"
+        "istanbul-lib-coverage": "^3.0.0",
+        "make-dir": "^4.0.0",
+        "supports-color": "^7.1.0"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=10"
       }
     },
-    "node_modules/yargs-parser": {
-      "version": "20.2.7",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz",
-      "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==",
+    "node_modules/istanbul-lib-source-maps": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+      "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
       "dev": true,
+      "dependencies": {
+        "debug": "^4.1.1",
+        "istanbul-lib-coverage": "^3.0.0",
+        "source-map": "^0.6.1"
+      },
       "engines": {
         "node": ">=10"
       }
     },
-    "node_modules/yn": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
-      "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+    "node_modules/istanbul-reports": {
+      "version": "3.1.7",
+      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz",
+      "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==",
       "dev": true,
+      "dependencies": {
+        "html-escaper": "^2.0.0",
+        "istanbul-lib-report": "^3.0.0"
+      },
       "engines": {
-        "node": ">=6"
-      }
-    }
-  },
-  "dependencies": {
-    "@apidevtools/json-schema-ref-parser": {
-      "version": "9.0.7",
-      "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.7.tgz",
-      "integrity": "sha512-QdwOGF1+eeyFh+17v2Tz626WX0nucd1iKOm6JUTUvCZdbolblCOOQCxGrQPY0f7jEhn36PiAWqZnsC2r5vmUWg==",
-      "dev": true,
-      "requires": {
-        "@jsdevtools/ono": "^7.1.3",
-        "call-me-maybe": "^1.0.1",
-        "js-yaml": "^3.13.1"
-      },
-      "dependencies": {
-        "argparse": {
-          "version": "1.0.10",
-          "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-          "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-          "dev": true,
-          "requires": {
-            "sprintf-js": "~1.0.2"
-          }
-        },
-        "js-yaml": {
-          "version": "3.14.1",
-          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
-          "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
-          "dev": true,
-          "requires": {
-            "argparse": "^1.0.7",
-            "esprima": "^4.0.0"
-          }
-        }
+        "node": ">=8"
       }
     },
-    "@babel/code-frame": {
-      "version": "7.12.13",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
-      "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
+    "node_modules/jackspeak": {
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+      "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
       "dev": true,
-      "requires": {
-        "@babel/highlight": "^7.12.13"
+      "dependencies": {
+        "@isaacs/cliui": "^8.0.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      },
+      "optionalDependencies": {
+        "@pkgjs/parseargs": "^0.11.0"
       }
     },
-    "@babel/helper-validator-identifier": {
-      "version": "7.14.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz",
-      "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==",
-      "dev": true
-    },
-    "@babel/highlight": {
-      "version": "7.14.0",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz",
-      "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==",
+    "node_modules/jake": {
+      "version": "10.9.1",
+      "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz",
+      "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==",
       "dev": true,
-      "requires": {
-        "@babel/helper-validator-identifier": "^7.14.0",
-        "chalk": "^2.0.0",
-        "js-tokens": "^4.0.0"
+      "dependencies": {
+        "async": "^3.2.3",
+        "chalk": "^4.0.2",
+        "filelist": "^1.0.4",
+        "minimatch": "^3.1.2"
+      },
+      "bin": {
+        "jake": "bin/cli.js"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
-    "@dtsgenerator/replace-namespace": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/@dtsgenerator/replace-namespace/-/replace-namespace-1.4.1.tgz",
-      "integrity": "sha512-L0DFdirXdb6CBYiV5ILYfcgqY83ThhhYBhauhn3MserpTPs+ODLLMGCRPyWPAxH9z7YUCho3y37si7EVGfJYJQ==",
+    "node_modules/jake/node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "dev": true,
-      "requires": {
-        "dtsgenerator": "^3.5.0",
-        "tslib": "^2.0.3"
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
       }
     },
-    "@eslint/eslintrc": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.1.tgz",
-      "integrity": "sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ==",
+    "node_modules/jake/node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "dev": true,
-      "requires": {
-        "ajv": "^6.12.4",
-        "debug": "^4.1.1",
-        "espree": "^7.3.0",
-        "globals": "^12.1.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.2.1",
-        "js-yaml": "^3.13.1",
-        "minimatch": "^3.0.4",
-        "strip-json-comments": "^3.1.1"
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
       },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/jest": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz",
+      "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
+      "dev": true,
       "dependencies": {
-        "ajv": {
-          "version": "6.12.6",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "argparse": {
-          "version": "1.0.10",
-          "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-          "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-          "dev": true,
-          "requires": {
-            "sprintf-js": "~1.0.2"
-          }
-        },
-        "globals": {
-          "version": "12.4.0",
-          "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
-          "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
-          "dev": true,
-          "requires": {
-            "type-fest": "^0.8.1"
-          }
-        },
-        "js-yaml": {
-          "version": "3.14.1",
-          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
-          "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
-          "dev": true,
-          "requires": {
-            "argparse": "^1.0.7",
-            "esprima": "^4.0.0"
-          }
-        },
-        "json-schema-traverse": {
-          "version": "0.4.1",
-          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-          "dev": true
-        },
-        "type-fest": {
-          "version": "0.8.1",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
-          "dev": true
+        "@jest/core": "^29.7.0",
+        "@jest/types": "^29.6.3",
+        "import-local": "^3.0.2",
+        "jest-cli": "^29.7.0"
+      },
+      "bin": {
+        "jest": "bin/jest.js"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      },
+      "peerDependencies": {
+        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+      },
+      "peerDependenciesMeta": {
+        "node-notifier": {
+          "optional": true
         }
       }
     },
-    "@jsdevtools/ono": {
-      "version": "7.1.3",
-      "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz",
-      "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==",
-      "dev": true
-    },
-    "@nodelib/fs.scandir": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz",
-      "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==",
+    "node_modules/jest-changed-files": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz",
+      "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==",
       "dev": true,
-      "requires": {
-        "@nodelib/fs.stat": "2.0.4",
-        "run-parallel": "^1.1.9"
+      "dependencies": {
+        "execa": "^5.0.0",
+        "jest-util": "^29.7.0",
+        "p-limit": "^3.1.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "@nodelib/fs.stat": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz",
-      "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==",
-      "dev": true
-    },
-    "@nodelib/fs.walk": {
-      "version": "1.2.6",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz",
-      "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==",
+    "node_modules/jest-circus": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz",
+      "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==",
       "dev": true,
-      "requires": {
-        "@nodelib/fs.scandir": "2.1.4",
-        "fastq": "^1.6.0"
+      "dependencies": {
+        "@jest/environment": "^29.7.0",
+        "@jest/expect": "^29.7.0",
+        "@jest/test-result": "^29.7.0",
+        "@jest/types": "^29.6.3",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "co": "^4.6.0",
+        "dedent": "^1.0.0",
+        "is-generator-fn": "^2.0.0",
+        "jest-each": "^29.7.0",
+        "jest-matcher-utils": "^29.7.0",
+        "jest-message-util": "^29.7.0",
+        "jest-runtime": "^29.7.0",
+        "jest-snapshot": "^29.7.0",
+        "jest-util": "^29.7.0",
+        "p-limit": "^3.1.0",
+        "pretty-format": "^29.7.0",
+        "pure-rand": "^6.0.0",
+        "slash": "^3.0.0",
+        "stack-utils": "^2.0.3"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/jest-cli": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz",
+      "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==",
+      "dev": true,
+      "dependencies": {
+        "@jest/core": "^29.7.0",
+        "@jest/test-result": "^29.7.0",
+        "@jest/types": "^29.6.3",
+        "chalk": "^4.0.0",
+        "create-jest": "^29.7.0",
+        "exit": "^0.1.2",
+        "import-local": "^3.0.2",
+        "jest-config": "^29.7.0",
+        "jest-util": "^29.7.0",
+        "jest-validate": "^29.7.0",
+        "yargs": "^17.3.1"
+      },
+      "bin": {
+        "jest": "bin/jest.js"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      },
+      "peerDependencies": {
+        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+      },
+      "peerDependenciesMeta": {
+        "node-notifier": {
+          "optional": true
+        }
       }
     },
-    "@rollup/plugin-commonjs": {
-      "version": "19.0.0",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-19.0.0.tgz",
-      "integrity": "sha512-adTpD6ATGbehdaQoZQ6ipDFhdjqsTgpOAhFiPwl+dzre4pPshsecptDPyEFb61JMJ1+mGljktaC4jI8ARMSNyw==",
+    "node_modules/jest-config": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz",
+      "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==",
       "dev": true,
-      "requires": {
-        "@rollup/pluginutils": "^3.1.0",
-        "commondir": "^1.0.1",
-        "estree-walker": "^2.0.1",
-        "glob": "^7.1.6",
-        "is-reference": "^1.2.1",
-        "magic-string": "^0.25.7",
-        "resolve": "^1.17.0"
-      },
       "dependencies": {
-        "estree-walker": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-          "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
-          "dev": true
+        "@babel/core": "^7.11.6",
+        "@jest/test-sequencer": "^29.7.0",
+        "@jest/types": "^29.6.3",
+        "babel-jest": "^29.7.0",
+        "chalk": "^4.0.0",
+        "ci-info": "^3.2.0",
+        "deepmerge": "^4.2.2",
+        "glob": "^7.1.3",
+        "graceful-fs": "^4.2.9",
+        "jest-circus": "^29.7.0",
+        "jest-environment-node": "^29.7.0",
+        "jest-get-type": "^29.6.3",
+        "jest-regex-util": "^29.6.3",
+        "jest-resolve": "^29.7.0",
+        "jest-runner": "^29.7.0",
+        "jest-util": "^29.7.0",
+        "jest-validate": "^29.7.0",
+        "micromatch": "^4.0.4",
+        "parse-json": "^5.2.0",
+        "pretty-format": "^29.7.0",
+        "slash": "^3.0.0",
+        "strip-json-comments": "^3.1.1"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      },
+      "peerDependencies": {
+        "@types/node": "*",
+        "ts-node": ">=9.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
+        "ts-node": {
+          "optional": true
         }
       }
     },
-    "@rollup/plugin-json": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz",
-      "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==",
+    "node_modules/jest-config/node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "dev": true,
-      "requires": {
-        "@rollup/pluginutils": "^3.0.8"
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
       }
     },
-    "@rollup/plugin-node-resolve": {
-      "version": "13.0.0",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.0.0.tgz",
-      "integrity": "sha512-41X411HJ3oikIDivT5OKe9EZ6ud6DXudtfNrGbC4nniaxx2esiWjkLOzgnZsWq1IM8YIeL2rzRGLZLBjlhnZtQ==",
+    "node_modules/jest-config/node_modules/glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
       "dev": true,
-      "requires": {
-        "@rollup/pluginutils": "^3.1.0",
-        "@types/resolve": "1.17.1",
-        "builtin-modules": "^3.1.0",
-        "deepmerge": "^4.2.2",
-        "is-module": "^1.0.0",
-        "resolve": "^1.19.0"
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "@rollup/pluginutils": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
-      "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
+    "node_modules/jest-config/node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "dev": true,
-      "requires": {
-        "@types/estree": "0.0.39",
-        "estree-walker": "^1.0.1",
-        "picomatch": "^2.2.2"
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
       }
     },
-    "@types/estree": {
-      "version": "0.0.39",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
-      "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
-      "dev": true
-    },
-    "@types/glob": {
-      "version": "7.1.3",
-      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
-      "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
+    "node_modules/jest-diff": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
+      "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
       "dev": true,
-      "requires": {
-        "@types/minimatch": "*",
-        "@types/node": "*"
+      "dependencies": {
+        "chalk": "^4.0.0",
+        "diff-sequences": "^29.6.3",
+        "jest-get-type": "^29.6.3",
+        "pretty-format": "^29.7.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "@types/jasmine": {
-      "version": "3.6.10",
-      "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.10.tgz",
-      "integrity": "sha512-yfCl7JGtIc5LjScFpeIGBBNhJFkJdAAcsAnAd9ZRHwzh+sR2zkt257BKkTCF5VpJ8wMPnzzZ8QatRdXM8tqpKA==",
-      "dev": true
-    },
-    "@types/js-yaml": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.1.tgz",
-      "integrity": "sha512-xdOvNmXmrZqqPy3kuCQ+fz6wA0xU5pji9cd1nDrflWaAWtYLLGk5ykW0H6yg5TVyehHP1pfmuuSaZkhP+kspVA==",
-      "dev": true
-    },
-    "@types/json-schema": {
-      "version": "7.0.7",
-      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz",
-      "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==",
-      "dev": true
-    },
-    "@types/minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==",
-      "dev": true
-    },
-    "@types/node": {
-      "version": "15.0.1",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.1.tgz",
-      "integrity": "sha512-TMkXt0Ck1y0KKsGr9gJtWGjttxlZnnvDtphxUOSd0bfaR6Q1jle+sPvrzNR1urqYTWMinoKvjKfXUGsumaO1PA==",
-      "dev": true
-    },
-    "@types/node-fetch": {
-      "version": "2.5.10",
-      "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.10.tgz",
-      "integrity": "sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ==",
+    "node_modules/jest-docblock": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz",
+      "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==",
       "dev": true,
-      "requires": {
-        "@types/node": "*",
-        "form-data": "^3.0.0"
+      "dependencies": {
+        "detect-newline": "^3.0.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "@types/parse-json": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
-      "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
-      "dev": true
-    },
-    "@types/resolve": {
-      "version": "1.17.1",
-      "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
-      "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
+    "node_modules/jest-each": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz",
+      "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==",
       "dev": true,
-      "requires": {
-        "@types/node": "*"
+      "dependencies": {
+        "@jest/types": "^29.6.3",
+        "chalk": "^4.0.0",
+        "jest-get-type": "^29.6.3",
+        "jest-util": "^29.7.0",
+        "pretty-format": "^29.7.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "@types/rimraf": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.0.tgz",
-      "integrity": "sha512-7WhJ0MdpFgYQPXlF4Dx+DhgvlPCfz/x5mHaeDQAKhcenvQP1KCpLQ18JklAqeGMYSAT2PxLpzd0g2/HE7fj7hQ==",
+    "node_modules/jest-environment-node": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
+      "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==",
       "dev": true,
-      "requires": {
-        "@types/glob": "*",
-        "@types/node": "*"
+      "dependencies": {
+        "@jest/environment": "^29.7.0",
+        "@jest/fake-timers": "^29.7.0",
+        "@jest/types": "^29.6.3",
+        "@types/node": "*",
+        "jest-mock": "^29.7.0",
+        "jest-util": "^29.7.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "@types/yargs": {
-      "version": "16.0.1",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.1.tgz",
-      "integrity": "sha512-x4HABGLyzr5hKUzBC9dvjciOTm11WVH1NWonNjGgxapnTHu5SWUqyqn0zQ6Re0yQU0lsQ6ztLCoMAKDGZflyxA==",
+    "node_modules/jest-get-type": {
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
+      "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
       "dev": true,
-      "requires": {
-        "@types/yargs-parser": "*"
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "@types/yargs-parser": {
-      "version": "20.2.0",
-      "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz",
-      "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==",
-      "dev": true
-    },
-    "@typescript-eslint/eslint-plugin": {
-      "version": "4.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.23.0.tgz",
-      "integrity": "sha512-tGK1y3KIvdsQEEgq6xNn1DjiFJtl+wn8JJQiETtCbdQxw1vzjXyAaIkEmO2l6Nq24iy3uZBMFQjZ6ECf1QdgGw==",
+    "node_modules/jest-haste-map": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz",
+      "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==",
       "dev": true,
-      "requires": {
-        "@typescript-eslint/experimental-utils": "4.23.0",
-        "@typescript-eslint/scope-manager": "4.23.0",
-        "debug": "^4.1.1",
-        "functional-red-black-tree": "^1.0.1",
-        "lodash": "^4.17.15",
-        "regexpp": "^3.0.0",
-        "semver": "^7.3.2",
-        "tsutils": "^3.17.1"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "7.3.5",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-          "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
+      "dependencies": {
+        "@jest/types": "^29.6.3",
+        "@types/graceful-fs": "^4.1.3",
+        "@types/node": "*",
+        "anymatch": "^3.0.3",
+        "fb-watchman": "^2.0.0",
+        "graceful-fs": "^4.2.9",
+        "jest-regex-util": "^29.6.3",
+        "jest-util": "^29.7.0",
+        "jest-worker": "^29.7.0",
+        "micromatch": "^4.0.4",
+        "walker": "^1.0.8"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "^2.3.2"
       }
     },
-    "@typescript-eslint/experimental-utils": {
-      "version": "4.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.23.0.tgz",
-      "integrity": "sha512-WAFNiTDnQfrF3Z2fQ05nmCgPsO5o790vOhmWKXbbYQTO9erE1/YsFot5/LnOUizLzU2eeuz6+U/81KV5/hFTGA==",
+    "node_modules/jest-leak-detector": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz",
+      "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==",
       "dev": true,
-      "requires": {
-        "@types/json-schema": "^7.0.3",
-        "@typescript-eslint/scope-manager": "4.23.0",
-        "@typescript-eslint/types": "4.23.0",
-        "@typescript-eslint/typescript-estree": "4.23.0",
-        "eslint-scope": "^5.0.0",
-        "eslint-utils": "^2.0.0"
+      "dependencies": {
+        "jest-get-type": "^29.6.3",
+        "pretty-format": "^29.7.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "@typescript-eslint/parser": {
-      "version": "4.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.23.0.tgz",
-      "integrity": "sha512-wsvjksHBMOqySy/Pi2Q6UuIuHYbgAMwLczRl4YanEPKW5KVxI9ZzDYh3B5DtcZPQTGRWFJrfcbJ6L01Leybwug==",
+    "node_modules/jest-matcher-utils": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
+      "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
       "dev": true,
-      "requires": {
-        "@typescript-eslint/scope-manager": "4.23.0",
-        "@typescript-eslint/types": "4.23.0",
-        "@typescript-eslint/typescript-estree": "4.23.0",
-        "debug": "^4.1.1"
+      "dependencies": {
+        "chalk": "^4.0.0",
+        "jest-diff": "^29.7.0",
+        "jest-get-type": "^29.6.3",
+        "pretty-format": "^29.7.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "@typescript-eslint/scope-manager": {
-      "version": "4.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.23.0.tgz",
-      "integrity": "sha512-ZZ21PCFxPhI3n0wuqEJK9omkw51wi2bmeKJvlRZPH5YFkcawKOuRMQMnI8mH6Vo0/DoHSeZJnHiIx84LmVQY+w==",
+    "node_modules/jest-message-util": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
+      "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
       "dev": true,
-      "requires": {
-        "@typescript-eslint/types": "4.23.0",
-        "@typescript-eslint/visitor-keys": "4.23.0"
+      "dependencies": {
+        "@babel/code-frame": "^7.12.13",
+        "@jest/types": "^29.6.3",
+        "@types/stack-utils": "^2.0.0",
+        "chalk": "^4.0.0",
+        "graceful-fs": "^4.2.9",
+        "micromatch": "^4.0.4",
+        "pretty-format": "^29.7.0",
+        "slash": "^3.0.0",
+        "stack-utils": "^2.0.3"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "@typescript-eslint/types": {
-      "version": "4.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.23.0.tgz",
-      "integrity": "sha512-oqkNWyG2SLS7uTWLZf6Sr7Dm02gA5yxiz1RP87tvsmDsguVATdpVguHr4HoGOcFOpCvx9vtCSCyQUGfzq28YCw==",
-      "dev": true
+    "node_modules/jest-mock": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
+      "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
+      "dev": true,
+      "dependencies": {
+        "@jest/types": "^29.6.3",
+        "@types/node": "*",
+        "jest-util": "^29.7.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
     },
-    "@typescript-eslint/typescript-estree": {
-      "version": "4.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.23.0.tgz",
-      "integrity": "sha512-5Sty6zPEVZF5fbvrZczfmLCOcby3sfrSPu30qKoY1U3mca5/jvU5cwsPb/CO6Q3ByRjixTMIVsDkqwIxCf/dMw==",
+    "node_modules/jest-pnp-resolver": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+      "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
       "dev": true,
-      "requires": {
-        "@typescript-eslint/types": "4.23.0",
-        "@typescript-eslint/visitor-keys": "4.23.0",
-        "debug": "^4.1.1",
-        "globby": "^11.0.1",
-        "is-glob": "^4.0.1",
-        "semver": "^7.3.2",
-        "tsutils": "^3.17.1"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "7.3.5",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-          "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
+      "engines": {
+        "node": ">=6"
+      },
+      "peerDependencies": {
+        "jest-resolve": "*"
+      },
+      "peerDependenciesMeta": {
+        "jest-resolve": {
+          "optional": true
         }
       }
     },
-    "@typescript-eslint/visitor-keys": {
-      "version": "4.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.23.0.tgz",
-      "integrity": "sha512-5PNe5cmX9pSifit0H+nPoQBXdbNzi5tOEec+3riK+ku4e3er37pKxMKDH5Ct5Y4fhWxcD4spnlYjxi9vXbSpwg==",
+    "node_modules/jest-regex-util": {
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
+      "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==",
       "dev": true,
-      "requires": {
-        "@typescript-eslint/types": "4.23.0",
-        "eslint-visitor-keys": "^2.0.0"
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "acorn": {
-      "version": "7.4.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
-      "dev": true
-    },
-    "acorn-jsx": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
-      "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+    "node_modules/jest-resolve": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz",
+      "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==",
       "dev": true,
-      "requires": {}
+      "dependencies": {
+        "chalk": "^4.0.0",
+        "graceful-fs": "^4.2.9",
+        "jest-haste-map": "^29.7.0",
+        "jest-pnp-resolver": "^1.2.2",
+        "jest-util": "^29.7.0",
+        "jest-validate": "^29.7.0",
+        "resolve": "^1.20.0",
+        "resolve.exports": "^2.0.0",
+        "slash": "^3.0.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
     },
-    "agent-base": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
-      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+    "node_modules/jest-resolve-dependencies": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz",
+      "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==",
       "dev": true,
-      "requires": {
-        "debug": "4"
+      "dependencies": {
+        "jest-regex-util": "^29.6.3",
+        "jest-snapshot": "^29.7.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "aggregate-error": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
-      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+    "node_modules/jest-runner": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz",
+      "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==",
       "dev": true,
-      "requires": {
-        "clean-stack": "^2.0.0",
-        "indent-string": "^4.0.0"
+      "dependencies": {
+        "@jest/console": "^29.7.0",
+        "@jest/environment": "^29.7.0",
+        "@jest/test-result": "^29.7.0",
+        "@jest/transform": "^29.7.0",
+        "@jest/types": "^29.6.3",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "emittery": "^0.13.1",
+        "graceful-fs": "^4.2.9",
+        "jest-docblock": "^29.7.0",
+        "jest-environment-node": "^29.7.0",
+        "jest-haste-map": "^29.7.0",
+        "jest-leak-detector": "^29.7.0",
+        "jest-message-util": "^29.7.0",
+        "jest-resolve": "^29.7.0",
+        "jest-runtime": "^29.7.0",
+        "jest-util": "^29.7.0",
+        "jest-watcher": "^29.7.0",
+        "jest-worker": "^29.7.0",
+        "p-limit": "^3.1.0",
+        "source-map-support": "0.5.13"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/jest-runtime": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz",
+      "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==",
+      "dev": true,
+      "dependencies": {
+        "@jest/environment": "^29.7.0",
+        "@jest/fake-timers": "^29.7.0",
+        "@jest/globals": "^29.7.0",
+        "@jest/source-map": "^29.6.3",
+        "@jest/test-result": "^29.7.0",
+        "@jest/transform": "^29.7.0",
+        "@jest/types": "^29.6.3",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "cjs-module-lexer": "^1.0.0",
+        "collect-v8-coverage": "^1.0.0",
+        "glob": "^7.1.3",
+        "graceful-fs": "^4.2.9",
+        "jest-haste-map": "^29.7.0",
+        "jest-message-util": "^29.7.0",
+        "jest-mock": "^29.7.0",
+        "jest-regex-util": "^29.6.3",
+        "jest-resolve": "^29.7.0",
+        "jest-snapshot": "^29.7.0",
+        "jest-util": "^29.7.0",
+        "slash": "^3.0.0",
+        "strip-bom": "^4.0.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "ajv": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz",
-      "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==",
-      "requires": {
-        "fast-deep-equal": "^3.1.1",
-        "json-schema-traverse": "^1.0.0",
-        "require-from-string": "^2.0.2",
-        "uri-js": "^4.2.2"
+    "node_modules/jest-runtime/node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
       }
     },
-    "ansi-colors": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
-      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
-      "dev": true
-    },
-    "ansi-escapes": {
-      "version": "4.3.2",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
-      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+    "node_modules/jest-runtime/node_modules/glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
       "dev": true,
-      "requires": {
-        "type-fest": "^0.21.3"
-      },
       "dependencies": {
-        "type-fest": {
-          "version": "0.21.3",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
-          "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
-          "dev": true
-        }
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "ansi-regex": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-      "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
-      "dev": true
-    },
-    "ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+    "node_modules/jest-runtime/node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "dev": true,
-      "requires": {
-        "color-convert": "^1.9.0"
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
       }
     },
-    "arg": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
-      "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
-      "dev": true
-    },
-    "argparse": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
-    },
-    "array-union": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
-      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
-      "dev": true
-    },
-    "astral-regex": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-      "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
-      "dev": true
-    },
-    "asynckit": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
-      "dev": true
-    },
-    "atob": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
-      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
-      "dev": true
-    },
-    "balanced-match": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
-      "dev": true
-    },
-    "brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+    "node_modules/jest-snapshot": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz",
+      "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==",
       "dev": true,
-      "requires": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
+      "dependencies": {
+        "@babel/core": "^7.11.6",
+        "@babel/generator": "^7.7.2",
+        "@babel/plugin-syntax-jsx": "^7.7.2",
+        "@babel/plugin-syntax-typescript": "^7.7.2",
+        "@babel/types": "^7.3.3",
+        "@jest/expect-utils": "^29.7.0",
+        "@jest/transform": "^29.7.0",
+        "@jest/types": "^29.6.3",
+        "babel-preset-current-node-syntax": "^1.0.0",
+        "chalk": "^4.0.0",
+        "expect": "^29.7.0",
+        "graceful-fs": "^4.2.9",
+        "jest-diff": "^29.7.0",
+        "jest-get-type": "^29.6.3",
+        "jest-matcher-utils": "^29.7.0",
+        "jest-message-util": "^29.7.0",
+        "jest-util": "^29.7.0",
+        "natural-compare": "^1.4.0",
+        "pretty-format": "^29.7.0",
+        "semver": "^7.5.3"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "braces": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+    "node_modules/jest-util": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
+      "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
       "dev": true,
-      "requires": {
-        "fill-range": "^7.0.1"
+      "dependencies": {
+        "@jest/types": "^29.6.3",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "ci-info": "^3.2.0",
+        "graceful-fs": "^4.2.9",
+        "picomatch": "^2.2.3"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "buffer-from": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
-      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
-      "dev": true
-    },
-    "builtin-modules": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz",
-      "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==",
-      "dev": true
-    },
-    "call-me-maybe": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
-      "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
-      "dev": true
-    },
-    "callsites": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
-      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
-      "dev": true
-    },
-    "chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+    "node_modules/jest-validate": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
+      "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
       "dev": true,
-      "requires": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
+      "dependencies": {
+        "@jest/types": "^29.6.3",
+        "camelcase": "^6.2.0",
+        "chalk": "^4.0.0",
+        "jest-get-type": "^29.6.3",
+        "leven": "^3.1.0",
+        "pretty-format": "^29.7.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "clean-stack": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
-      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
-      "dev": true
-    },
-    "cli-cursor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
-      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+    "node_modules/jest-validate/node_modules/camelcase": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
       "dev": true,
-      "requires": {
-        "restore-cursor": "^3.1.0"
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "cli-truncate": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
-      "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
-      "dev": true,
-      "requires": {
-        "slice-ansi": "^3.0.0",
-        "string-width": "^4.2.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "slice-ansi": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
-          "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.0.0",
-            "astral-regex": "^2.0.0",
-            "is-fullwidth-code-point": "^3.0.0"
-          }
-        }
+    "node_modules/jest-watcher": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz",
+      "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==",
+      "dev": true,
+      "dependencies": {
+        "@jest/test-result": "^29.7.0",
+        "@jest/types": "^29.6.3",
+        "@types/node": "*",
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^4.0.0",
+        "emittery": "^0.13.1",
+        "jest-util": "^29.7.0",
+        "string-length": "^4.0.1"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "cliui": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
-      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+    "node_modules/jest-worker": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
+      "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
       "dev": true,
-      "requires": {
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.0",
-        "wrap-ansi": "^7.0.0"
+      "dependencies": {
+        "@types/node": "*",
+        "jest-util": "^29.7.0",
+        "merge-stream": "^2.0.0",
+        "supports-color": "^8.0.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+    "node_modules/jest-worker/node_modules/supports-color": {
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
       "dev": true,
-      "requires": {
-        "color-name": "1.1.3"
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/supports-color?sponsor=1"
       }
     },
-    "color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
       "dev": true
     },
-    "combined-stream": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
-      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "dev": true,
-      "requires": {
-        "delayed-stream": "~1.0.0"
+    "node_modules/js-yaml": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+      "dependencies": {
+        "argparse": "^2.0.1"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
       }
     },
-    "commander": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
-      "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
-      "dev": true
+    "node_modules/jsesc": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+      "dev": true,
+      "bin": {
+        "jsesc": "bin/jsesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
     },
-    "commondir": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
-      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+    "node_modules/json-buffer": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
       "dev": true
     },
-    "concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+    "node_modules/json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
       "dev": true
     },
-    "cosmiconfig": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
-      "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
+    "node_modules/json-schema-to-typescript": {
+      "version": "15.0.2",
+      "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-15.0.2.tgz",
+      "integrity": "sha512-+cRBw+bBJ3k783mZroDIgz1pLNPB4hvj6nnbHTWwEVl0dkW8qdZ+M9jWhBb+Y0FAdHvNsXACga3lewGO8lktrw==",
       "dev": true,
-      "requires": {
-        "@types/parse-json": "^4.0.0",
-        "import-fresh": "^3.2.1",
-        "parse-json": "^5.0.0",
-        "path-type": "^4.0.0",
-        "yaml": "^1.10.0"
+      "dependencies": {
+        "@apidevtools/json-schema-ref-parser": "^11.5.5",
+        "@types/json-schema": "^7.0.15",
+        "@types/lodash": "^4.17.7",
+        "glob": "^10.3.12",
+        "is-glob": "^4.0.3",
+        "js-yaml": "^4.1.0",
+        "lodash": "^4.17.21",
+        "minimist": "^1.2.8",
+        "prettier": "^3.2.5"
+      },
+      "bin": {
+        "json2ts": "dist/src/cli.js"
+      },
+      "engines": {
+        "node": ">=16.0.0"
       }
     },
-    "create-require": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
-      "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+    "node_modules/json-schema-traverse": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+    },
+    "node_modules/json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
       "dev": true
     },
-    "cross-fetch": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz",
-      "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==",
+    "node_modules/json5": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
       "dev": true,
-      "requires": {
-        "node-fetch": "2.6.1"
+      "bin": {
+        "json5": "lib/cli.js"
+      },
+      "engines": {
+        "node": ">=6"
       }
     },
-    "cross-spawn": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+    "node_modules/jsonfile": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
       "dev": true,
-      "requires": {
-        "path-key": "^3.1.0",
-        "shebang-command": "^2.0.0",
-        "which": "^2.0.1"
+      "dependencies": {
+        "universalify": "^2.0.0"
+      },
+      "optionalDependencies": {
+        "graceful-fs": "^4.1.6"
       }
     },
-    "debug": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
-      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+    "node_modules/keyv": {
+      "version": "4.5.4",
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+      "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
       "dev": true,
-      "requires": {
-        "ms": "2.1.2"
+      "dependencies": {
+        "json-buffer": "3.0.1"
       }
     },
-    "decode-uri-component": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
-      "dev": true
-    },
-    "dedent": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
-      "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
-      "dev": true
-    },
-    "deep-is": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
-      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
-      "dev": true
-    },
-    "deepmerge": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
-      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
-      "dev": true
-    },
-    "delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
-      "dev": true
-    },
-    "diff": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
-      "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
-      "dev": true
+    "node_modules/kleur": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
     },
-    "dir-glob": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
-      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+    "node_modules/leven": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
       "dev": true,
-      "requires": {
-        "path-type": "^4.0.0"
+      "engines": {
+        "node": ">=6"
       }
     },
-    "doctrine": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
-      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+    "node_modules/levn": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
       "dev": true,
-      "requires": {
-        "esutils": "^2.0.2"
+      "dependencies": {
+        "prelude-ls": "^1.2.1",
+        "type-check": "~0.4.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
       }
     },
-    "dtsgenerator": {
-      "version": "3.10.0",
-      "resolved": "https://registry.npmjs.org/dtsgenerator/-/dtsgenerator-3.10.0.tgz",
-      "integrity": "sha512-3MOlYOB7Y9OcWhbInWr3ndasfvwi8K5eB1SCQT3MsyeYFJ49j8ffFnGv09fz8hptOzvhDW0SzutB/HuMoaUP8w==",
+    "node_modules/lilconfig": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
+      "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
       "dev": true,
-      "requires": {
-        "commander": "^7.2.0",
-        "cross-fetch": "^3.1.4",
-        "debug": "^4.3.1",
-        "glob": "^7.1.6",
-        "https-proxy-agent": "^5.0.0",
-        "js-yaml": "^4.1.0",
-        "tslib": "^2.2.0",
-        "typescript": "^4.2.4"
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antonk52"
       }
     },
-    "emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+    "node_modules/lines-and-columns": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
       "dev": true
     },
-    "enquirer": {
-      "version": "2.3.6",
-      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
-      "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
-      "dev": true,
-      "requires": {
-        "ansi-colors": "^4.1.1"
+    "node_modules/lint-staged": {
+      "version": "15.2.7",
+      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.7.tgz",
+      "integrity": "sha512-+FdVbbCZ+yoh7E/RosSdqKJyUM2OEjTciH0TFNkawKgvFp1zbGlEC39RADg+xKBG1R4mhoH2j85myBQZ5wR+lw==",
+      "dev": true,
+      "dependencies": {
+        "chalk": "~5.3.0",
+        "commander": "~12.1.0",
+        "debug": "~4.3.4",
+        "execa": "~8.0.1",
+        "lilconfig": "~3.1.1",
+        "listr2": "~8.2.1",
+        "micromatch": "~4.0.7",
+        "pidtree": "~0.6.0",
+        "string-argv": "~0.3.2",
+        "yaml": "~2.4.2"
+      },
+      "bin": {
+        "lint-staged": "bin/lint-staged.js"
+      },
+      "engines": {
+        "node": ">=18.12.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/lint-staged"
       }
     },
-    "error-ex": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
-      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+    "node_modules/lint-staged/node_modules/chalk": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
+      "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
       "dev": true,
-      "requires": {
-        "is-arrayish": "^0.2.1"
+      "engines": {
+        "node": "^12.17.0 || ^14.13 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
       }
     },
-    "escalade": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
-      "dev": true
-    },
-    "escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
-      "dev": true
-    },
-    "eslint": {
-      "version": "7.26.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.26.0.tgz",
-      "integrity": "sha512-4R1ieRf52/izcZE7AlLy56uIHHDLT74Yzz2Iv2l6kDaYvEu9x+wMB5dZArVL8SYGXSYV2YAg70FcW5Y5nGGNIg==",
+    "node_modules/lint-staged/node_modules/execa": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
+      "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
       "dev": true,
-      "requires": {
-        "@babel/code-frame": "7.12.11",
-        "@eslint/eslintrc": "^0.4.1",
-        "ajv": "^6.10.0",
-        "chalk": "^4.0.0",
-        "cross-spawn": "^7.0.2",
-        "debug": "^4.0.1",
-        "doctrine": "^3.0.0",
-        "enquirer": "^2.3.5",
-        "eslint-scope": "^5.1.1",
-        "eslint-utils": "^2.1.0",
-        "eslint-visitor-keys": "^2.0.0",
-        "espree": "^7.3.1",
-        "esquery": "^1.4.0",
-        "esutils": "^2.0.2",
-        "file-entry-cache": "^6.0.1",
-        "functional-red-black-tree": "^1.0.1",
-        "glob-parent": "^5.0.0",
-        "globals": "^13.6.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.0.0",
-        "imurmurhash": "^0.1.4",
-        "is-glob": "^4.0.0",
-        "js-yaml": "^3.13.1",
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "levn": "^0.4.1",
-        "lodash": "^4.17.21",
-        "minimatch": "^3.0.4",
-        "natural-compare": "^1.4.0",
-        "optionator": "^0.9.1",
-        "progress": "^2.0.0",
-        "regexpp": "^3.1.0",
-        "semver": "^7.2.1",
-        "strip-ansi": "^6.0.0",
-        "strip-json-comments": "^3.1.0",
-        "table": "^6.0.4",
-        "text-table": "^0.2.0",
-        "v8-compile-cache": "^2.0.3"
-      },
-      "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.12.11",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
-          "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
-          "dev": true,
-          "requires": {
-            "@babel/highlight": "^7.10.4"
-          }
-        },
-        "ajv": {
-          "version": "6.12.6",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^3.1.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "argparse": {
-          "version": "1.0.10",
-          "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-          "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-          "dev": true,
-          "requires": {
-            "sprintf-js": "~1.0.2"
-          }
-        },
-        "chalk": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
-          "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
-        "js-yaml": {
-          "version": "3.14.1",
-          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
-          "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
-          "dev": true,
-          "requires": {
-            "argparse": "^1.0.7",
-            "esprima": "^4.0.0"
-          }
-        },
-        "json-schema-traverse": {
-          "version": "0.4.1",
-          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-          "dev": true
-        },
-        "semver": {
-          "version": "7.3.5",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-          "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
+      "dependencies": {
+        "cross-spawn": "^7.0.3",
+        "get-stream": "^8.0.1",
+        "human-signals": "^5.0.0",
+        "is-stream": "^3.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^5.1.0",
+        "onetime": "^6.0.0",
+        "signal-exit": "^4.1.0",
+        "strip-final-newline": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=16.17"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/execa?sponsor=1"
       }
     },
-    "eslint-config-prettier": {
-      "version": "8.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz",
-      "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==",
+    "node_modules/lint-staged/node_modules/get-stream": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
+      "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
       "dev": true,
-      "requires": {}
+      "engines": {
+        "node": ">=16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
     },
-    "eslint-plugin-prettier": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz",
-      "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==",
+    "node_modules/lint-staged/node_modules/human-signals": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
+      "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
       "dev": true,
-      "requires": {
-        "prettier-linter-helpers": "^1.0.0"
+      "engines": {
+        "node": ">=16.17.0"
       }
     },
-    "eslint-scope": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
-      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+    "node_modules/lint-staged/node_modules/is-stream": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+      "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
       "dev": true,
-      "requires": {
-        "esrecurse": "^4.3.0",
-        "estraverse": "^4.1.1"
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "eslint-utils": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
-      "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+    "node_modules/lint-staged/node_modules/mimic-fn": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+      "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
       "dev": true,
-      "requires": {
-        "eslint-visitor-keys": "^1.1.0"
+      "engines": {
+        "node": ">=12"
       },
-      "dependencies": {
-        "eslint-visitor-keys": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-          "dev": true
-        }
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "eslint-visitor-keys": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
-      "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
-      "dev": true
-    },
-    "espree": {
-      "version": "7.3.1",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
-      "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
+    "node_modules/lint-staged/node_modules/npm-run-path": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
+      "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
       "dev": true,
-      "requires": {
-        "acorn": "^7.4.0",
-        "acorn-jsx": "^5.3.1",
-        "eslint-visitor-keys": "^1.3.0"
-      },
       "dependencies": {
-        "eslint-visitor-keys": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-          "dev": true
-        }
+        "path-key": "^4.0.0"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "esprima": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-      "dev": true
-    },
-    "esquery": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
-      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+    "node_modules/lint-staged/node_modules/onetime": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+      "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
       "dev": true,
-      "requires": {
-        "estraverse": "^5.1.0"
-      },
       "dependencies": {
-        "estraverse": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
-          "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
-          "dev": true
-        }
+        "mimic-fn": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "esrecurse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
-      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+    "node_modules/lint-staged/node_modules/path-key": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+      "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
       "dev": true,
-      "requires": {
-        "estraverse": "^5.2.0"
+      "engines": {
+        "node": ">=12"
       },
-      "dependencies": {
-        "estraverse": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
-          "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
-          "dev": true
-        }
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "estraverse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-      "dev": true
-    },
-    "estree-walker": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
-      "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
-      "dev": true
-    },
-    "esutils": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
-      "dev": true
-    },
-    "execa": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz",
-      "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==",
+    "node_modules/lint-staged/node_modules/strip-final-newline": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+      "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
       "dev": true,
-      "requires": {
-        "cross-spawn": "^7.0.3",
-        "get-stream": "^6.0.0",
-        "human-signals": "^2.1.0",
-        "is-stream": "^2.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^4.0.1",
-        "onetime": "^5.1.2",
-        "signal-exit": "^3.0.3",
-        "strip-final-newline": "^2.0.0"
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "fast-deep-equal": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
-    },
-    "fast-diff": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
-      "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
-      "dev": true
+    "node_modules/listr2": {
+      "version": "8.2.3",
+      "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.3.tgz",
+      "integrity": "sha512-Lllokma2mtoniUOS94CcOErHWAug5iu7HOmDrvWgpw8jyQH2fomgB+7lZS4HWZxytUuQwkGOwe49FvwVaA85Xw==",
+      "dev": true,
+      "dependencies": {
+        "cli-truncate": "^4.0.0",
+        "colorette": "^2.0.20",
+        "eventemitter3": "^5.0.1",
+        "log-update": "^6.0.0",
+        "rfdc": "^1.4.1",
+        "wrap-ansi": "^9.0.0"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      }
     },
-    "fast-glob": {
-      "version": "3.2.5",
-      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz",
-      "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==",
+    "node_modules/listr2/node_modules/ansi-regex": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
       "dev": true,
-      "requires": {
-        "@nodelib/fs.stat": "^2.0.2",
-        "@nodelib/fs.walk": "^1.2.3",
-        "glob-parent": "^5.1.0",
-        "merge2": "^1.3.0",
-        "micromatch": "^4.0.2",
-        "picomatch": "^2.2.1"
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
       }
     },
-    "fast-json-stable-stringify": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
-      "dev": true
+    "node_modules/listr2/node_modules/ansi-styles": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
     },
-    "fast-levenshtein": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+    "node_modules/listr2/node_modules/emoji-regex": {
+      "version": "10.3.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz",
+      "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==",
       "dev": true
     },
-    "fastq": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz",
-      "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==",
+    "node_modules/listr2/node_modules/string-width": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+      "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
       "dev": true,
-      "requires": {
-        "reusify": "^1.0.4"
+      "dependencies": {
+        "emoji-regex": "^10.3.0",
+        "get-east-asian-width": "^1.0.0",
+        "strip-ansi": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "figures": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
-      "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+    "node_modules/listr2/node_modules/strip-ansi": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
       "dev": true,
-      "requires": {
-        "escape-string-regexp": "^1.0.5"
+      "dependencies": {
+        "ansi-regex": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
       }
     },
-    "file-entry-cache": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
-      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+    "node_modules/listr2/node_modules/wrap-ansi": {
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
+      "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
       "dev": true,
-      "requires": {
-        "flat-cache": "^3.0.4"
+      "dependencies": {
+        "ansi-styles": "^6.2.1",
+        "string-width": "^7.0.0",
+        "strip-ansi": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
       }
     },
-    "fill-range": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+    "node_modules/locate-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
       "dev": true,
-      "requires": {
-        "to-regex-range": "^5.0.1"
+      "dependencies": {
+        "p-locate": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "find-cache-dir": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
-      "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
-      "dev": true,
-      "requires": {
-        "commondir": "^1.0.1",
-        "make-dir": "^3.0.2",
-        "pkg-dir": "^4.1.0"
-      }
+    "node_modules/lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+      "dev": true
     },
-    "find-up": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+    "node_modules/lodash.memoize": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+      "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
+      "dev": true
+    },
+    "node_modules/lodash.merge": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+      "dev": true
+    },
+    "node_modules/log-update": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz",
+      "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==",
       "dev": true,
-      "requires": {
-        "locate-path": "^5.0.0",
-        "path-exists": "^4.0.0"
+      "dependencies": {
+        "ansi-escapes": "^6.2.0",
+        "cli-cursor": "^4.0.0",
+        "slice-ansi": "^7.0.0",
+        "strip-ansi": "^7.1.0",
+        "wrap-ansi": "^9.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "flat-cache": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
-      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+    "node_modules/log-update/node_modules/ansi-escapes": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz",
+      "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==",
       "dev": true,
-      "requires": {
-        "flatted": "^3.1.0",
-        "rimraf": "^3.0.2"
+      "engines": {
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "flatted": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
-      "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
-      "dev": true
-    },
-    "form-data": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
-      "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
+    "node_modules/log-update/node_modules/ansi-regex": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
       "dev": true,
-      "requires": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.8",
-        "mime-types": "^2.1.12"
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
       }
     },
-    "fs-extra": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
-      "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+    "node_modules/log-update/node_modules/ansi-styles": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
       "dev": true,
-      "requires": {
-        "graceful-fs": "^4.2.0",
-        "jsonfile": "^4.0.0",
-        "universalify": "^0.1.0"
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
       }
     },
-    "fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+    "node_modules/log-update/node_modules/emoji-regex": {
+      "version": "10.3.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz",
+      "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==",
       "dev": true
     },
-    "fsevents": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
-      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+    "node_modules/log-update/node_modules/is-fullwidth-code-point": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz",
+      "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==",
       "dev": true,
-      "optional": true
-    },
-    "function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
-    },
-    "functional-red-black-tree": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
-      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
-      "dev": true
-    },
-    "get-caller-file": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-      "dev": true
-    },
-    "get-own-enumerable-property-symbols": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
-      "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
-      "dev": true
-    },
-    "get-stream": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
-      "dev": true
+      "dependencies": {
+        "get-east-asian-width": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
     },
-    "glob": {
-      "version": "7.1.6",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
-      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+    "node_modules/log-update/node_modules/slice-ansi": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz",
+      "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==",
       "dev": true,
-      "requires": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
+      "dependencies": {
+        "ansi-styles": "^6.2.1",
+        "is-fullwidth-code-point": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/slice-ansi?sponsor=1"
       }
     },
-    "glob-parent": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
-      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+    "node_modules/log-update/node_modules/string-width": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+      "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
       "dev": true,
-      "requires": {
-        "is-glob": "^4.0.1"
+      "dependencies": {
+        "emoji-regex": "^10.3.0",
+        "get-east-asian-width": "^1.0.0",
+        "strip-ansi": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "globals": {
-      "version": "13.8.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz",
-      "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==",
+    "node_modules/log-update/node_modules/strip-ansi": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
       "dev": true,
-      "requires": {
-        "type-fest": "^0.20.2"
+      "dependencies": {
+        "ansi-regex": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
       }
     },
-    "globby": {
-      "version": "11.0.3",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz",
-      "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==",
+    "node_modules/log-update/node_modules/wrap-ansi": {
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
+      "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
       "dev": true,
-      "requires": {
-        "array-union": "^2.1.0",
-        "dir-glob": "^3.0.1",
-        "fast-glob": "^3.1.1",
-        "ignore": "^5.1.4",
-        "merge2": "^1.3.0",
-        "slash": "^3.0.0"
-      },
       "dependencies": {
-        "ignore": {
-          "version": "5.1.8",
-          "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
-          "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
-          "dev": true
-        }
+        "ansi-styles": "^6.2.1",
+        "string-width": "^7.0.0",
+        "strip-ansi": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
       }
     },
-    "graceful-fs": {
-      "version": "4.2.6",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
-      "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
-      "dev": true
-    },
-    "has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+    "node_modules/lru-cache": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
       "dev": true,
-      "requires": {
-        "function-bind": "^1.1.1"
+      "dependencies": {
+        "yallist": "^3.0.2"
       }
     },
-    "has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true
-    },
-    "https-proxy-agent": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
-      "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
+    "node_modules/magic-string": {
+      "version": "0.30.10",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz",
+      "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==",
       "dev": true,
-      "requires": {
-        "agent-base": "6",
-        "debug": "4"
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.4.15"
       }
     },
-    "human-signals": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
-      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
-      "dev": true
-    },
-    "husky": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/husky/-/husky-6.0.0.tgz",
-      "integrity": "sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ==",
-      "dev": true
+    "node_modules/make-dir": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+      "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+      "dev": true,
+      "dependencies": {
+        "semver": "^7.5.3"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
     },
-    "ignore": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
-      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+    "node_modules/make-error": {
+      "version": "1.3.6",
+      "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+      "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
       "dev": true
     },
-    "import-fresh": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
-      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+    "node_modules/makeerror": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+      "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
       "dev": true,
-      "requires": {
-        "parent-module": "^1.0.0",
-        "resolve-from": "^4.0.0"
+      "dependencies": {
+        "tmpl": "1.0.5"
       }
     },
-    "imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
-      "dev": true
-    },
-    "indent-string": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
-      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+    "node_modules/merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
       "dev": true
     },
-    "inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+    "node_modules/merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
       "dev": true,
-      "requires": {
-        "once": "^1.3.0",
-        "wrappy": "1"
+      "engines": {
+        "node": ">= 8"
       }
     },
-    "inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true
+    "node_modules/micromatch": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+      "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "braces": "^3.0.3",
+        "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=8.6"
+      }
     },
-    "interpret": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
-      "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
-      "dev": true
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
     },
-    "is-arrayish": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
-      "dev": true
+    "node_modules/mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "dev": true,
+      "dependencies": {
+        "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
     },
-    "is-core-module": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.3.0.tgz",
-      "integrity": "sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw==",
+    "node_modules/mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
       "dev": true,
-      "requires": {
-        "has": "^1.0.3"
+      "engines": {
+        "node": ">=6"
       }
     },
-    "is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
-      "dev": true
+    "node_modules/minimatch": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
     },
-    "is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true
+    "node_modules/minimist": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
     },
-    "is-glob": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
-      "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+    "node_modules/minipass": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
       "dev": true,
-      "requires": {
-        "is-extglob": "^2.1.1"
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
       }
     },
-    "is-module": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
-      "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
-      "dev": true
+    "node_modules/mkdirp": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
+      "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
+      "dev": true,
+      "bin": {
+        "mkdirp": "dist/cjs/src/bin.js"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
     },
-    "is-number": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+    "node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
       "dev": true
     },
-    "is-obj": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
-      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+    "node_modules/natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
       "dev": true
     },
-    "is-reference": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
-      "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
+    "node_modules/node-domexception": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+      "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
       "dev": true,
-      "requires": {
-        "@types/estree": "*"
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/jimmywarting"
+        },
+        {
+          "type": "github",
+          "url": "https://paypal.me/jimmywarting"
+        }
+      ],
+      "engines": {
+        "node": ">=10.5.0"
       }
     },
-    "is-regexp": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
-      "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
-      "dev": true
-    },
-    "is-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
-      "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
-      "dev": true
+    "node_modules/node-fetch": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+      "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
+      "dev": true,
+      "dependencies": {
+        "data-uri-to-buffer": "^4.0.0",
+        "fetch-blob": "^3.1.4",
+        "formdata-polyfill": "^4.0.10"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/node-fetch"
+      }
     },
-    "is-unicode-supported": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
-      "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+    "node_modules/node-int64": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+      "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
       "dev": true
     },
-    "isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+    "node_modules/node-releases": {
+      "version": "2.0.14",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
+      "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
       "dev": true
     },
-    "jasmine": {
-      "version": "3.7.0",
-      "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.7.0.tgz",
-      "integrity": "sha512-wlzGQ+cIFzMEsI+wDqmOwvnjTvolLFwlcpYLCqSPPH0prOQaW3P+IzMhHYn934l1imNvw07oCyX+vGUv3wmtSQ==",
+    "node_modules/normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
       "dev": true,
-      "requires": {
-        "glob": "^7.1.6",
-        "jasmine-core": "~3.7.0"
+      "engines": {
+        "node": ">=0.10.0"
       }
     },
-    "jasmine-core": {
-      "version": "3.7.1",
-      "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.7.1.tgz",
-      "integrity": "sha512-DH3oYDS/AUvvr22+xUBW62m1Xoy7tUlY1tsxKEJvl5JeJ7q8zd1K5bUwiOxdH+erj6l2vAMM3hV25Xs9/WrmuQ==",
-      "dev": true
-    },
-    "jest-worker": {
-      "version": "26.6.2",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
-      "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*",
-        "merge-stream": "^2.0.0",
-        "supports-color": "^7.0.0"
+    "node_modules/npm-run-path": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "dev": true,
+      "dependencies": {
+        "path-key": "^3.0.0"
       },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "dev": true,
       "dependencies": {
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
+        "wrappy": "1"
       }
     },
-    "js-tokens": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
-      "dev": true
+    "node_modules/onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+      "dev": true,
+      "dependencies": {
+        "mimic-fn": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
     },
-    "js-yaml": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
-      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
-      "requires": {
-        "argparse": "^2.0.1"
+    "node_modules/optionator": {
+      "version": "0.9.4",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+      "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+      "dev": true,
+      "dependencies": {
+        "deep-is": "^0.1.3",
+        "fast-levenshtein": "^2.0.6",
+        "levn": "^0.4.1",
+        "prelude-ls": "^1.2.1",
+        "type-check": "^0.4.0",
+        "word-wrap": "^1.2.5"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
       }
     },
-    "json-parse-even-better-errors": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
-      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
-      "dev": true
+    "node_modules/p-limit": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+      "dev": true,
+      "dependencies": {
+        "yocto-queue": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-locate": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+      "dev": true,
+      "dependencies": {
+        "p-limit": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
     },
-    "json-schema-traverse": {
+    "node_modules/package-json-from-dist": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
-      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+      "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz",
+      "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==",
+      "dev": true
     },
-    "json-stable-stringify-without-jsonify": {
+    "node_modules/parent-module": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
-      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "dev": true,
+      "dependencies": {
+        "callsites": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/parse-json": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.0.0",
+        "error-ex": "^1.3.1",
+        "json-parse-even-better-errors": "^2.3.0",
+        "lines-and-columns": "^1.1.6"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/path-browserify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
+      "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
       "dev": true
     },
-    "jsonfile": {
+    "node_modules/path-exists": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
-      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
       "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.6"
+      "engines": {
+        "node": ">=8"
       }
     },
-    "levn": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
-      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+    "node_modules/path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
       "dev": true,
-      "requires": {
-        "prelude-ls": "^1.2.1",
-        "type-check": "~0.4.0"
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
       }
     },
-    "lines-and-columns": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
-      "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+    "node_modules/path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
       "dev": true
     },
-    "lint-staged": {
-      "version": "11.0.0",
-      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.0.0.tgz",
-      "integrity": "sha512-3rsRIoyaE8IphSUtO1RVTFl1e0SLBtxxUOPBtHxQgBHS5/i6nqvjcUfNioMa4BU9yGnPzbO+xkfLtXtxBpCzjw==",
-      "dev": true,
-      "requires": {
-        "chalk": "^4.1.1",
-        "cli-truncate": "^2.1.0",
-        "commander": "^7.2.0",
-        "cosmiconfig": "^7.0.0",
-        "debug": "^4.3.1",
-        "dedent": "^0.7.0",
-        "enquirer": "^2.3.6",
-        "execa": "^5.0.0",
-        "listr2": "^3.8.2",
-        "log-symbols": "^4.1.0",
-        "micromatch": "^4.0.4",
-        "normalize-path": "^3.0.0",
-        "please-upgrade-node": "^3.2.0",
-        "string-argv": "0.3.1",
-        "stringify-object": "^3.3.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
-          "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
+    "node_modules/path-scurry": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+      "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+      "dev": true,
+      "dependencies": {
+        "lru-cache": "^10.2.0",
+        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "listr2": {
-      "version": "3.8.2",
-      "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.8.2.tgz",
-      "integrity": "sha512-E28Fw7Zd3HQlCJKzb9a8C8M0HtFWQeucE+S8YrSrqZObuCLPRHMRrR8gNmYt65cU9orXYHwvN5agXC36lYt7VQ==",
-      "dev": true,
-      "requires": {
-        "chalk": "^4.1.1",
-        "cli-truncate": "^2.1.0",
-        "figures": "^3.2.0",
-        "indent-string": "^4.0.0",
-        "log-update": "^4.0.0",
-        "p-map": "^4.0.0",
-        "rxjs": "^6.6.7",
-        "through": "^2.3.8",
-        "wrap-ansi": "^7.0.0"
+    "node_modules/path-scurry/node_modules/lru-cache": {
+      "version": "10.4.3",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+      "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+      "dev": true
+    },
+    "node_modules/path-type": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/picocolors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+      "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
+      "dev": true
+    },
+    "node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true,
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/pidtree": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
+      "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
+      "dev": true,
+      "bin": {
+        "pidtree": "bin/pidtree.js"
       },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/pirates": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+      "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/pkg-dir": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+      "dev": true,
       "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
-          "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
+        "find-up": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "locate-path": {
+    "node_modules/pkg-dir/node_modules/find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "dev": true,
+      "dependencies": {
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/pkg-dir/node_modules/locate-path": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
       "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
       "dev": true,
-      "requires": {
+      "dependencies": {
         "p-locate": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "lodash": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
-      "dev": true
-    },
-    "lodash.clonedeep": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
-      "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
-      "dev": true
-    },
-    "lodash.truncate": {
-      "version": "4.4.2",
-      "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
-      "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
-      "dev": true
-    },
-    "log-symbols": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
-      "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
-      "dev": true,
-      "requires": {
-        "chalk": "^4.1.0",
-        "is-unicode-supported": "^0.1.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
-          "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
+    "node_modules/pkg-dir/node_modules/p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "dev": true,
+      "dependencies": {
+        "p-try": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/pkg-dir/node_modules/p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "dev": true,
+      "dependencies": {
+        "p-limit": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/prelude-ls": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/prettier": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
+      "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
+      "dev": true,
+      "bin": {
+        "prettier": "bin/prettier.cjs"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/prettier/prettier?sponsor=1"
+      }
+    },
+    "node_modules/prettier-linter-helpers": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+      "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+      "dev": true,
+      "dependencies": {
+        "fast-diff": "^1.1.2"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/pretty-format": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+      "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+      "dev": true,
+      "dependencies": {
+        "@jest/schemas": "^29.6.3",
+        "ansi-styles": "^5.0.0",
+        "react-is": "^18.0.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/pretty-format/node_modules/ansi-styles": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+      "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/prompts": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+      "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+      "dev": true,
+      "dependencies": {
+        "kleur": "^3.0.3",
+        "sisteransi": "^1.0.5"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/punycode": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/pure-rand": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
+      "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/dubzzz"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/fast-check"
+        }
+      ]
+    },
+    "node_modules/queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "dev": true,
+      "dependencies": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "node_modules/react-is": {
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+      "dev": true
+    },
+    "node_modules/rechoir": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+      "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
+      "dev": true,
+      "dependencies": {
+        "resolve": "^1.1.6"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/require-from-string": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/resolve": {
+      "version": "1.22.8",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+      "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+      "dev": true,
+      "dependencies": {
+        "is-core-module": "^2.13.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/resolve-cwd": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+      "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+      "dev": true,
+      "dependencies": {
+        "resolve-from": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/resolve-cwd/node_modules/resolve-from": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/resolve-from": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/resolve.exports": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz",
+      "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/restore-cursor": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz",
+      "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==",
+      "dev": true,
+      "dependencies": {
+        "onetime": "^5.1.0",
+        "signal-exit": "^3.0.2"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/restore-cursor/node_modules/signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+      "dev": true
+    },
+    "node_modules/reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "dev": true,
+      "engines": {
+        "iojs": ">=1.0.0",
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/rfdc": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+      "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+      "dev": true
+    },
+    "node_modules/rimraf": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz",
+      "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==",
+      "dev": true,
+      "dependencies": {
+        "glob": "^11.0.0",
+        "package-json-from-dist": "^1.0.0"
+      },
+      "bin": {
+        "rimraf": "dist/esm/bin.mjs"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/rimraf/node_modules/glob": {
+      "version": "11.0.0",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz",
+      "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==",
+      "dev": true,
+      "dependencies": {
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^4.0.1",
+        "minimatch": "^10.0.0",
+        "minipass": "^7.1.2",
+        "package-json-from-dist": "^1.0.0",
+        "path-scurry": "^2.0.0"
+      },
+      "bin": {
+        "glob": "dist/esm/bin.mjs"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/rimraf/node_modules/jackspeak": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz",
+      "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==",
+      "dev": true,
+      "dependencies": {
+        "@isaacs/cliui": "^8.0.2"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      },
+      "optionalDependencies": {
+        "@pkgjs/parseargs": "^0.11.0"
+      }
+    },
+    "node_modules/rimraf/node_modules/lru-cache": {
+      "version": "11.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz",
+      "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==",
+      "dev": true,
+      "engines": {
+        "node": "20 || >=22"
+      }
+    },
+    "node_modules/rimraf/node_modules/minimatch": {
+      "version": "10.0.1",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz",
+      "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/rimraf/node_modules/path-scurry": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz",
+      "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==",
+      "dev": true,
+      "dependencies": {
+        "lru-cache": "^11.0.0",
+        "minipass": "^7.1.2"
+      },
+      "engines": {
+        "node": "20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/rollup": {
+      "version": "2.79.2",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz",
+      "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "rollup": "dist/bin/rollup"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/rollup-plugin-sourcemaps": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.6.3.tgz",
+      "integrity": "sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==",
+      "dev": true,
+      "dependencies": {
+        "@rollup/pluginutils": "^3.0.9",
+        "source-map-resolve": "^0.6.0"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "peerDependencies": {
+        "@types/node": ">=10.0.0",
+        "rollup": ">=0.31.2"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/rollup-plugin-sourcemaps/node_modules/@rollup/pluginutils": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
+      "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
+      "dev": true,
+      "dependencies": {
+        "@types/estree": "0.0.39",
+        "estree-walker": "^1.0.1",
+        "picomatch": "^2.2.2"
+      },
+      "engines": {
+        "node": ">= 8.0.0"
+      },
+      "peerDependencies": {
+        "rollup": "^1.20.0||^2.0.0"
+      }
+    },
+    "node_modules/rollup-plugin-sourcemaps/node_modules/@types/estree": {
+      "version": "0.0.39",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
+      "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
+      "dev": true
+    },
+    "node_modules/rollup-plugin-sourcemaps/node_modules/estree-walker": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
+      "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
+      "dev": true
+    },
+    "node_modules/rollup-plugin-terser": {
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
+      "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
+      "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser",
+      "dev": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.10.4",
+        "jest-worker": "^26.2.1",
+        "serialize-javascript": "^4.0.0",
+        "terser": "^5.0.0"
+      },
+      "peerDependencies": {
+        "rollup": "^2.0.0"
+      }
+    },
+    "node_modules/rollup-plugin-terser/node_modules/jest-worker": {
+      "version": "26.6.2",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
+      "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
+      "dev": true,
+      "dependencies": {
+        "@types/node": "*",
+        "merge-stream": "^2.0.0",
+        "supports-color": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      }
+    },
+    "node_modules/rollup-plugin-typescript2": {
+      "version": "0.36.0",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.36.0.tgz",
+      "integrity": "sha512-NB2CSQDxSe9+Oe2ahZbf+B4bh7pHwjV5L+RSYpCu7Q5ROuN94F9b6ioWwKfz3ueL3KTtmX4o2MUH2cgHDIEUsw==",
+      "dev": true,
+      "dependencies": {
+        "@rollup/pluginutils": "^4.1.2",
+        "find-cache-dir": "^3.3.2",
+        "fs-extra": "^10.0.0",
+        "semver": "^7.5.4",
+        "tslib": "^2.6.2"
+      },
+      "peerDependencies": {
+        "rollup": ">=1.26.3",
+        "typescript": ">=2.4.0"
+      }
+    },
+    "node_modules/rollup-plugin-typescript2/node_modules/@rollup/pluginutils": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz",
+      "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==",
+      "dev": true,
+      "dependencies": {
+        "estree-walker": "^2.0.1",
+        "picomatch": "^2.2.2"
+      },
+      "engines": {
+        "node": ">= 8.0.0"
+      }
+    },
+    "node_modules/run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "dependencies": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
         }
+      ]
+    },
+    "node_modules/semver": {
+      "version": "7.6.2",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+      "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+      "dev": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/serialize-javascript": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+      "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+      "dev": true,
+      "dependencies": {
+        "randombytes": "^2.1.0"
+      }
+    },
+    "node_modules/shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dev": true,
+      "dependencies": {
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shelljs": {
+      "version": "0.8.5",
+      "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
+      "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
+      "dev": true,
+      "dependencies": {
+        "glob": "^7.0.0",
+        "interpret": "^1.0.0",
+        "rechoir": "^0.6.2"
+      },
+      "bin": {
+        "shjs": "bin/shjs"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/shelljs/node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/shelljs/node_modules/glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
+      "dev": true,
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/shelljs/node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/shx": {
+      "version": "0.3.4",
+      "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz",
+      "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==",
+      "dev": true,
+      "dependencies": {
+        "minimist": "^1.2.3",
+        "shelljs": "^0.8.5"
+      },
+      "bin": {
+        "shx": "lib/cli.js"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/signal-exit": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+      "dev": true,
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/sisteransi": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+      "dev": true
+    },
+    "node_modules/slash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/slice-ansi": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
+      "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^6.0.0",
+        "is-fullwidth-code-point": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/slice-ansi?sponsor=1"
       }
     },
-    "log-update": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
-      "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
-      "dev": true,
-      "requires": {
-        "ansi-escapes": "^4.3.0",
-        "cli-cursor": "^3.1.0",
-        "slice-ansi": "^4.0.0",
-        "wrap-ansi": "^6.2.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
-        "wrap-ansi": {
-          "version": "6.2.0",
-          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
-          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.0.0",
-            "string-width": "^4.1.0",
-            "strip-ansi": "^6.0.0"
-          }
-        }
+    "node_modules/slice-ansi/node_modules/ansi-styles": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
       }
     },
-    "lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+    "node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
       "dev": true,
-      "requires": {
-        "yallist": "^4.0.0"
+      "engines": {
+        "node": ">=0.10.0"
       }
     },
-    "magic-string": {
-      "version": "0.25.7",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
-      "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
+    "node_modules/source-map-resolve": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz",
+      "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==",
+      "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated",
       "dev": true,
-      "requires": {
-        "sourcemap-codec": "^1.4.4"
+      "dependencies": {
+        "atob": "^2.1.2",
+        "decode-uri-component": "^0.2.0"
       }
     },
-    "make-dir": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
-      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+    "node_modules/source-map-support": {
+      "version": "0.5.13",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
+      "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
       "dev": true,
-      "requires": {
-        "semver": "^6.0.0"
+      "dependencies": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
       }
     },
-    "make-error": {
-      "version": "1.3.6",
-      "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
-      "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
-      "dev": true
-    },
-    "merge-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
-      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
-      "dev": true
-    },
-    "merge2": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
-      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+    "node_modules/sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
       "dev": true
     },
-    "micromatch": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
-      "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
+    "node_modules/stack-utils": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+      "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
       "dev": true,
-      "requires": {
-        "braces": "^3.0.1",
-        "picomatch": "^2.2.3"
+      "dependencies": {
+        "escape-string-regexp": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
-    "mime-db": {
-      "version": "1.47.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz",
-      "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==",
-      "dev": true
-    },
-    "mime-types": {
-      "version": "2.1.30",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz",
-      "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==",
+    "node_modules/stack-utils/node_modules/escape-string-regexp": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+      "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
       "dev": true,
-      "requires": {
-        "mime-db": "1.47.0"
+      "engines": {
+        "node": ">=8"
       }
     },
-    "mimic-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
-      "dev": true
-    },
-    "minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+    "node_modules/string-argv": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz",
+      "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==",
       "dev": true,
-      "requires": {
-        "brace-expansion": "^1.1.7"
+      "engines": {
+        "node": ">=0.6.19"
       }
     },
-    "minimist": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-      "dev": true
+    "node_modules/string-length": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+      "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+      "dev": true,
+      "dependencies": {
+        "char-regex": "^1.0.2",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
     },
-    "ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
+    "node_modules/string-width": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+      "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+      "dev": true,
+      "dependencies": {
+        "eastasianwidth": "^0.2.0",
+        "emoji-regex": "^9.2.2",
+        "strip-ansi": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
     },
-    "natural-compare": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
-      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
-      "dev": true
+    "node_modules/string-width-cjs": {
+      "name": "string-width",
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
     },
-    "node-fetch": {
-      "version": "2.6.1",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
-      "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
+    "node_modules/string-width-cjs/node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
       "dev": true
     },
-    "normalize-path": {
+    "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": {
       "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-      "dev": true
-    },
-    "npm-run-path": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
       "dev": true,
-      "requires": {
-        "path-key": "^3.0.0"
+      "engines": {
+        "node": ">=8"
       }
     },
-    "once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+    "node_modules/string-width/node_modules/ansi-regex": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
       "dev": true,
-      "requires": {
-        "wrappy": "1"
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
       }
     },
-    "onetime": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
-      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+    "node_modules/string-width/node_modules/strip-ansi": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
       "dev": true,
-      "requires": {
-        "mimic-fn": "^2.1.0"
+      "dependencies": {
+        "ansi-regex": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
       }
     },
-    "optionator": {
-      "version": "0.9.1",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
-      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+    "node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
       "dev": true,
-      "requires": {
-        "deep-is": "^0.1.3",
-        "fast-levenshtein": "^2.0.6",
-        "levn": "^0.4.1",
-        "prelude-ls": "^1.2.1",
-        "type-check": "^0.4.0",
-        "word-wrap": "^1.2.3"
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+    "node_modules/strip-ansi-cjs": {
+      "name": "strip-ansi",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
       "dev": true,
-      "requires": {
-        "p-try": "^2.0.0"
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "p-locate": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+    "node_modules/strip-bom": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+      "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
       "dev": true,
-      "requires": {
-        "p-limit": "^2.2.0"
+      "engines": {
+        "node": ">=8"
       }
     },
-    "p-map": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
-      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+    "node_modules/strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
       "dev": true,
-      "requires": {
-        "aggregate-error": "^3.0.0"
+      "engines": {
+        "node": ">=6"
       }
     },
-    "p-try": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-      "dev": true
-    },
-    "parent-module": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
-      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+    "node_modules/strip-json-comments": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
       "dev": true,
-      "requires": {
-        "callsites": "^3.0.0"
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "parse-json": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
-      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+    "node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
       "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "error-ex": "^1.3.1",
-        "json-parse-even-better-errors": "^2.3.0",
-        "lines-and-columns": "^1.1.6"
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "path-exists": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-      "dev": true
-    },
-    "path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "dev": true
-    },
-    "path-key": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "dev": true
+    "node_modules/supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
     },
-    "path-parse": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
-      "dev": true
+    "node_modules/synckit": {
+      "version": "0.8.8",
+      "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz",
+      "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==",
+      "dev": true,
+      "dependencies": {
+        "@pkgr/core": "^0.1.0",
+        "tslib": "^2.6.2"
+      },
+      "engines": {
+        "node": "^14.18.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/unts"
+      }
     },
-    "path-type": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-      "dev": true
+    "node_modules/terser": {
+      "version": "5.31.2",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.2.tgz",
+      "integrity": "sha512-LGyRZVFm/QElZHy/CPr/O4eNZOZIzsrQ92y4v9UJe/pFJjypje2yI3C2FmPtvUEnhadlSbmG2nXtdcjHOjCfxw==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/source-map": "^0.3.3",
+        "acorn": "^8.8.2",
+        "commander": "^2.20.0",
+        "source-map-support": "~0.5.20"
+      },
+      "bin": {
+        "terser": "bin/terser"
+      },
+      "engines": {
+        "node": ">=10"
+      }
     },
-    "picomatch": {
-      "version": "2.2.3",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz",
-      "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==",
+    "node_modules/terser/node_modules/commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
       "dev": true
     },
-    "pkg-dir": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
-      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+    "node_modules/terser/node_modules/source-map-support": {
+      "version": "0.5.21",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
       "dev": true,
-      "requires": {
-        "find-up": "^4.0.0"
+      "dependencies": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
       }
     },
-    "please-upgrade-node": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz",
-      "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==",
+    "node_modules/test-exclude": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+      "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
       "dev": true,
-      "requires": {
-        "semver-compare": "^1.0.0"
+      "dependencies": {
+        "@istanbuljs/schema": "^0.1.2",
+        "glob": "^7.1.4",
+        "minimatch": "^3.0.4"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "prelude-ls": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
-      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
-      "dev": true
-    },
-    "prettier": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.0.tgz",
-      "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==",
-      "dev": true
-    },
-    "prettier-linter-helpers": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
-      "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+    "node_modules/test-exclude/node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "dev": true,
-      "requires": {
-        "fast-diff": "^1.1.2"
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
       }
     },
-    "progress": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
-      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
-      "dev": true
-    },
-    "punycode": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
-    },
-    "queue-microtask": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
-      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
-      "dev": true
-    },
-    "randombytes": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
-      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+    "node_modules/test-exclude/node_modules/glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
       "dev": true,
-      "requires": {
-        "safe-buffer": "^5.1.0"
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "rechoir": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
-      "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+    "node_modules/test-exclude/node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "dev": true,
-      "requires": {
-        "resolve": "^1.1.6"
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
       }
     },
-    "regexpp": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
-      "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
-      "dev": true
-    },
-    "require-directory": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+    "node_modules/text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
       "dev": true
     },
-    "require-from-string": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
-      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
-    },
-    "resolve": {
-      "version": "1.20.0",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
-      "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
-      "dev": true,
-      "requires": {
-        "is-core-module": "^2.2.0",
-        "path-parse": "^1.0.6"
-      }
-    },
-    "resolve-from": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+    "node_modules/tmpl": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+      "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
       "dev": true
     },
-    "restore-cursor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
-      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+    "node_modules/to-fast-properties": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
       "dev": true,
-      "requires": {
-        "onetime": "^5.1.0",
-        "signal-exit": "^3.0.2"
+      "engines": {
+        "node": ">=4"
       }
     },
-    "reusify": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
-      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
-      "dev": true
-    },
-    "rimraf": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+    "node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
       "dev": true,
-      "requires": {
-        "glob": "^7.1.3"
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
       }
     },
-    "rollup": {
-      "version": "2.47.0",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.47.0.tgz",
-      "integrity": "sha512-rqBjgq9hQfW0vRmz+0S062ORRNJXvwRpzxhFXORvar/maZqY6za3rgQ/p1Glg+j1hnc1GtYyQCPiAei95uTElg==",
+    "node_modules/ts-api-utils": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
+      "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
       "dev": true,
-      "requires": {
-        "fsevents": "~2.3.1"
+      "engines": {
+        "node": ">=16"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.2.0"
       }
     },
-    "rollup-plugin-sourcemaps": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.6.3.tgz",
-      "integrity": "sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==",
-      "dev": true,
-      "requires": {
-        "@rollup/pluginutils": "^3.0.9",
-        "source-map-resolve": "^0.6.0"
-      }
+    "node_modules/ts-inference-check": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/ts-inference-check/-/ts-inference-check-0.3.0.tgz",
+      "integrity": "sha512-nJ0MflAJTFmvJq0bP+KYcPze4WWE+VgkVZt2mL+qiizdqSI/PX55b21q9LpqiSLOOiRPdOWjW5Tsxrrf+jByog==",
+      "dev": true
     },
-    "rollup-plugin-terser": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
-      "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
+    "node_modules/ts-jest": {
+      "version": "29.2.2",
+      "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.2.tgz",
+      "integrity": "sha512-sSW7OooaKT34AAngP6k1VS669a0HdLxkQZnlC7T76sckGCokXFnvJ3yRlQZGRTAoV5K19HfSgCiSwWOSIfcYlg==",
       "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.10.4",
-        "jest-worker": "^26.2.1",
-        "serialize-javascript": "^4.0.0",
-        "terser": "^5.0.0"
-      }
-    },
-    "rollup-plugin-typescript2": {
-      "version": "0.30.0",
-      "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.30.0.tgz",
-      "integrity": "sha512-NUFszIQyhgDdhRS9ya/VEmsnpTe+GERDMmFo0Y+kf8ds51Xy57nPNGglJY+W6x1vcouA7Au7nsTgsLFj2I0PxQ==",
-      "dev": true,
-      "requires": {
-        "@rollup/pluginutils": "^4.1.0",
-        "find-cache-dir": "^3.3.1",
-        "fs-extra": "8.1.0",
-        "resolve": "1.20.0",
-        "tslib": "2.1.0"
-      },
-      "dependencies": {
-        "@rollup/pluginutils": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.0.tgz",
-          "integrity": "sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ==",
-          "dev": true,
-          "requires": {
-            "estree-walker": "^2.0.1",
-            "picomatch": "^2.2.2"
-          }
+      "dependencies": {
+        "bs-logger": "0.x",
+        "ejs": "^3.0.0",
+        "fast-json-stable-stringify": "2.x",
+        "jest-util": "^29.0.0",
+        "json5": "^2.2.3",
+        "lodash.memoize": "4.x",
+        "make-error": "1.x",
+        "semver": "^7.5.3",
+        "yargs-parser": "^21.0.1"
+      },
+      "bin": {
+        "ts-jest": "cli.js"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0"
+      },
+      "peerDependencies": {
+        "@babel/core": ">=7.0.0-beta.0 <8",
+        "@jest/transform": "^29.0.0",
+        "@jest/types": "^29.0.0",
+        "babel-jest": "^29.0.0",
+        "jest": "^29.0.0",
+        "typescript": ">=4.3 <6"
+      },
+      "peerDependenciesMeta": {
+        "@babel/core": {
+          "optional": true
+        },
+        "@jest/transform": {
+          "optional": true
+        },
+        "@jest/types": {
+          "optional": true
         },
-        "estree-walker": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-          "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
-          "dev": true
+        "babel-jest": {
+          "optional": true
         },
-        "tslib": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
-          "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==",
-          "dev": true
+        "esbuild": {
+          "optional": true
         }
       }
     },
-    "run-parallel": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
-      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+    "node_modules/ts-morph": {
+      "version": "23.0.0",
+      "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-23.0.0.tgz",
+      "integrity": "sha512-FcvFx7a9E8TUe6T3ShihXJLiJOiqyafzFKUO4aqIHDUCIvADdGNShcbc2W5PMr3LerXRv7mafvFZ9lRENxJmug==",
       "dev": true,
-      "requires": {
-        "queue-microtask": "^1.2.2"
+      "dependencies": {
+        "@ts-morph/common": "~0.24.0",
+        "code-block-writer": "^13.0.1"
       }
     },
-    "rxjs": {
-      "version": "6.6.7",
-      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
-      "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
-      "dev": true,
-      "requires": {
-        "tslib": "^1.9.0"
+    "node_modules/ts-node": {
+      "version": "10.9.2",
+      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
+      "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
+      "dev": true,
+      "dependencies": {
+        "@cspotcode/source-map-support": "^0.8.0",
+        "@tsconfig/node10": "^1.0.7",
+        "@tsconfig/node12": "^1.0.7",
+        "@tsconfig/node14": "^1.0.0",
+        "@tsconfig/node16": "^1.0.2",
+        "acorn": "^8.4.1",
+        "acorn-walk": "^8.1.1",
+        "arg": "^4.1.0",
+        "create-require": "^1.1.0",
+        "diff": "^4.0.1",
+        "make-error": "^1.1.1",
+        "v8-compile-cache-lib": "^3.0.1",
+        "yn": "3.1.1"
       },
-      "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-          "dev": true
+      "bin": {
+        "ts-node": "dist/bin.js",
+        "ts-node-cwd": "dist/bin-cwd.js",
+        "ts-node-esm": "dist/bin-esm.js",
+        "ts-node-script": "dist/bin-script.js",
+        "ts-node-transpile-only": "dist/bin-transpile.js",
+        "ts-script": "dist/bin-script-deprecated.js"
+      },
+      "peerDependencies": {
+        "@swc/core": ">=1.2.50",
+        "@swc/wasm": ">=1.2.50",
+        "@types/node": "*",
+        "typescript": ">=2.7"
+      },
+      "peerDependenciesMeta": {
+        "@swc/core": {
+          "optional": true
+        },
+        "@swc/wasm": {
+          "optional": true
         }
       }
     },
-    "safe-buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-      "dev": true
-    },
-    "semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "dev": true
-    },
-    "semver-compare": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
-      "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
+    "node_modules/tslib": {
+      "version": "2.6.3",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
+      "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
       "dev": true
     },
-    "serialize-javascript": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
-      "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+    "node_modules/type-check": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
       "dev": true,
-      "requires": {
-        "randombytes": "^2.1.0"
+      "dependencies": {
+        "prelude-ls": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
       }
     },
-    "shebang-command": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+    "node_modules/type-detect": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+      "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
       "dev": true,
-      "requires": {
-        "shebang-regex": "^3.0.0"
+      "engines": {
+        "node": ">=4"
       }
     },
-    "shebang-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-      "dev": true
-    },
-    "shelljs": {
-      "version": "0.8.4",
-      "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz",
-      "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==",
+    "node_modules/type-fest": {
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
       "dev": true,
-      "requires": {
-        "glob": "^7.0.0",
-        "interpret": "^1.0.0",
-        "rechoir": "^0.6.2"
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "shx": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.3.tgz",
-      "integrity": "sha512-nZJ3HFWVoTSyyB+evEKjJ1STiixGztlqwKLTUNV5KqMWtGey9fTd4KU1gdZ1X9BV6215pswQ/Jew9NsuS/fNDA==",
+    "node_modules/typescript": {
+      "version": "5.5.3",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz",
+      "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==",
       "dev": true,
-      "requires": {
-        "minimist": "^1.2.3",
-        "shelljs": "^0.8.4"
+      "bin": {
+        "tsc": "bin/tsc",
+        "tsserver": "bin/tsserver"
+      },
+      "engines": {
+        "node": ">=14.17"
       }
     },
-    "signal-exit": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
-      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+    "node_modules/undici-types": {
+      "version": "5.26.5",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+      "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
       "dev": true
     },
-    "slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-      "dev": true
+    "node_modules/universalify": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+      "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+      "dev": true,
+      "engines": {
+        "node": ">= 10.0.0"
+      }
+    },
+    "node_modules/update-browserslist-db": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
+      "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "dependencies": {
+        "escalade": "^3.1.2",
+        "picocolors": "^1.0.1"
+      },
+      "bin": {
+        "update-browserslist-db": "cli.js"
+      },
+      "peerDependencies": {
+        "browserslist": ">= 4.21.0"
+      }
     },
-    "slice-ansi": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
-      "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+    "node_modules/uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
       "dev": true,
-      "requires": {
-        "ansi-styles": "^4.0.0",
-        "astral-regex": "^2.0.0",
-        "is-fullwidth-code-point": "^3.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        }
+      "dependencies": {
+        "punycode": "^2.1.0"
       }
     },
-    "source-map": {
-      "version": "0.7.3",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+    "node_modules/v8-compile-cache-lib": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+      "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
       "dev": true
     },
-    "source-map-resolve": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz",
-      "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==",
+    "node_modules/v8-to-istanbul": {
+      "version": "9.3.0",
+      "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
+      "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==",
       "dev": true,
-      "requires": {
-        "atob": "^2.1.2",
-        "decode-uri-component": "^0.2.0"
+      "dependencies": {
+        "@jridgewell/trace-mapping": "^0.3.12",
+        "@types/istanbul-lib-coverage": "^2.0.1",
+        "convert-source-map": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10.12.0"
       }
     },
-    "source-map-support": {
-      "version": "0.5.19",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
-      "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+    "node_modules/walker": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+      "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
       "dev": true,
-      "requires": {
-        "buffer-from": "^1.0.0",
-        "source-map": "^0.6.0"
-      },
       "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
+        "makeerror": "1.0.12"
       }
     },
-    "sourcemap-codec": {
-      "version": "1.4.8",
-      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
-      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
-      "dev": true
-    },
-    "sprintf-js": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
-      "dev": true
-    },
-    "string-argv": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
-      "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==",
-      "dev": true
-    },
-    "string-width": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
-      "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+    "node_modules/web-streams-polyfill": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
+      "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
       "dev": true,
-      "requires": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.0"
+      "engines": {
+        "node": ">= 8"
       }
     },
-    "stringify-object": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
-      "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+    "node_modules/which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
       "dev": true,
-      "requires": {
-        "get-own-enumerable-property-symbols": "^3.0.0",
-        "is-obj": "^1.0.1",
-        "is-regexp": "^1.0.0"
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
       }
     },
-    "strip-ansi": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-      "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+    "node_modules/word-wrap": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+      "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
       "dev": true,
-      "requires": {
-        "ansi-regex": "^5.0.0"
+      "engines": {
+        "node": ">=0.10.0"
       }
     },
-    "strip-final-newline": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
-      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
-      "dev": true
-    },
-    "strip-json-comments": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
-      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
-      "dev": true
-    },
-    "supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+    "node_modules/wrap-ansi": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+      "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
       "dev": true,
-      "requires": {
-        "has-flag": "^3.0.0"
+      "dependencies": {
+        "ansi-styles": "^6.1.0",
+        "string-width": "^5.0.1",
+        "strip-ansi": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
       }
     },
-    "table": {
-      "version": "6.7.1",
-      "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz",
-      "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==",
+    "node_modules/wrap-ansi-cjs": {
+      "name": "wrap-ansi",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
       "dev": true,
-      "requires": {
-        "ajv": "^8.0.1",
-        "lodash.clonedeep": "^4.5.0",
-        "lodash.truncate": "^4.4.2",
-        "slice-ansi": "^4.0.0",
-        "string-width": "^4.2.0",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
         "strip-ansi": "^6.0.0"
-      }
-    },
-    "terser": {
-      "version": "5.7.0",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.0.tgz",
-      "integrity": "sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g==",
-      "dev": true,
-      "requires": {
-        "commander": "^2.20.0",
-        "source-map": "~0.7.2",
-        "source-map-support": "~0.5.19"
       },
-      "dependencies": {
-        "commander": {
-          "version": "2.20.3",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-          "dev": true
-        }
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
       }
     },
-    "text-table": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
-      "dev": true
-    },
-    "through": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+    "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
       "dev": true
     },
-    "to-regex-range": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+    "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
       "dev": true,
-      "requires": {
-        "is-number": "^7.0.0"
+      "engines": {
+        "node": ">=8"
       }
     },
-    "ts-node": {
-      "version": "9.1.1",
-      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz",
-      "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==",
+    "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
       "dev": true,
-      "requires": {
-        "arg": "^4.1.0",
-        "create-require": "^1.1.0",
-        "diff": "^4.0.1",
-        "make-error": "^1.1.1",
-        "source-map-support": "^0.5.17",
-        "yn": "3.1.1"
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
-    "tslib": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz",
-      "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==",
-      "dev": true
-    },
-    "tsutils": {
-      "version": "3.21.0",
-      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
-      "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+    "node_modules/wrap-ansi/node_modules/ansi-regex": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
       "dev": true,
-      "requires": {
-        "tslib": "^1.8.1"
+      "engines": {
+        "node": ">=12"
       },
-      "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-          "dev": true
-        }
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
       }
     },
-    "type-check": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
-      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+    "node_modules/wrap-ansi/node_modules/ansi-styles": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
       "dev": true,
-      "requires": {
-        "prelude-ls": "^1.2.1"
-      }
-    },
-    "type-fest": {
-      "version": "0.20.2",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
-      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
-      "dev": true
-    },
-    "typescript": {
-      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz",
-      "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==",
-      "dev": true
-    },
-    "universalify": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
-      "dev": true
-    },
-    "uri-js": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
-      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
-      "requires": {
-        "punycode": "^2.1.0"
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
       }
     },
-    "v8-compile-cache": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
-      "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
-      "dev": true
-    },
-    "which": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+    "node_modules/wrap-ansi/node_modules/strip-ansi": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
       "dev": true,
-      "requires": {
-        "isexe": "^2.0.0"
+      "dependencies": {
+        "ansi-regex": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
       }
     },
-    "word-wrap": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
-      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
       "dev": true
     },
-    "wrap-ansi": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
-      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+    "node_modules/write-file-atomic": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
+      "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
       "dev": true,
-      "requires": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
       "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        }
+        "imurmurhash": "^0.1.4",
+        "signal-exit": "^3.0.7"
+      },
+      "engines": {
+        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
       }
     },
-    "wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+    "node_modules/write-file-atomic/node_modules/signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
       "dev": true
     },
-    "y18n": {
+    "node_modules/y18n": {
       "version": "5.0.8",
       "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
       "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      }
     },
-    "yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+    "node_modules/yallist": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
       "dev": true
     },
-    "yaml": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
-      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
-      "dev": true
+    "node_modules/yaml": {
+      "version": "2.4.5",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz",
+      "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==",
+      "dev": true,
+      "bin": {
+        "yaml": "bin.mjs"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
     },
-    "yargs": {
-      "version": "17.0.1",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.0.1.tgz",
-      "integrity": "sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==",
+    "node_modules/yargs": {
+      "version": "17.7.2",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+      "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
       "dev": true,
-      "requires": {
-        "cliui": "^7.0.2",
+      "dependencies": {
+        "cliui": "^8.0.1",
         "escalade": "^3.1.1",
         "get-caller-file": "^2.0.5",
         "require-directory": "^2.1.1",
-        "string-width": "^4.2.0",
+        "string-width": "^4.2.3",
         "y18n": "^5.0.5",
-        "yargs-parser": "^20.2.2"
+        "yargs-parser": "^21.1.1"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/yargs-parser": {
+      "version": "21.1.1",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+      "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
       }
     },
-    "yargs-parser": {
-      "version": "20.2.7",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz",
-      "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==",
+    "node_modules/yargs/node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
       "dev": true
     },
-    "yn": {
+    "node_modules/yargs/node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/yargs/node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/yn": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
       "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
-      "dev": true
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/yocto-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
     }
   }
 }
diff --git a/package.json b/package.json
index ca56a359..8c5380a0 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
-  "name": "@severlessworkflow/sdk-typescript",
-  "version": "2.0.0",
-  "schemaVersion": "0.7",
+  "name": "@serverlessworkflow/sdk",
+  "version": "1.0.1",
+  "schemaVersion": "1.0.0",
   "description": "Typescript SDK for Serverless Workflow Specification",
   "main": "umd/index.umd.min.js",
   "browser": "umd/index.umd.min.js",
@@ -16,57 +16,62 @@
     "prettier": "npx prettier",
     "lint-staged": "npx lint-staged",
     "clean": "npx rimraf dist && rimraf out-tsc",
-    "tools:download-schemas": "npx ts-node --project ./tools/tsconfig.json ./tools/download-schemas.ts",
-    "tools:generate-definitions": "npx ts-node --project ./tools/tsconfig.json ./tools/generate-definitions.ts",
-    "tools:generate-builders": "npx ts-node --project ./tools/tsconfig.json ./tools/generate-builders.ts",
-    "update-code-base": "npm run tools:download-schemas && npm run tools:generate-definitions && npm run tools:generate-builders && npm run format && npm run test",
+    "tools:1_download-schemas": "npx ts-node --project ./tools/tsconfig.json ./tools/1_download-schemas.ts",
+    "tools:2_generate-definitions": "npx ts-node --project ./tools/tsconfig.json ./tools/2_generate-definitions.ts",
+    "tools:3_generate-validation-pointers": "npx ts-node --project ./tools/tsconfig.json ./tools/3_generate-validation-pointers.ts",
+    "tools:4_generate-classes": "npx ts-node --project ./tools/tsconfig.json ./tools/4_generate-classes.ts",
+    "tools:5_generate-builders": "npx ts-node --project ./tools/tsconfig.json ./tools/5_generate-builders.ts",
+    "update-code-base": "npm run tools:1_download-schemas && npm run tools:2_generate-definitions && npm run tools:3_generate-validation-pointers && npm run tools:4_generate-classes && npm run tools:5_generate-builders && npm run format && npm run test",
     "format": "npx prettier --write \"**/*.ts\"",
     "lint": "npx eslint . --ext .ts && npx prettier --check \"**/*.ts\"",
     "pretest": "npx rimraf out-tsc",
-    "test": "npx tsc --project ./tests/tsconfig.json && npx jasmine --config=./tests/support/jasmine.json",
+    "test": "npx tsc --project ./tests/tsconfig.json && npx jest",
     "prebuild": "npx rimraf dist",
-    "build": "npx rollup -c rollup.config.ts",
+    "build": "npx rollup -c rollup.config.ts && npx shx mv ./dist/src/lib ./dist/lib &&  npx shx mv ./dist/src/*d.ts.map ./dist/src/*d.ts ./dist && npx rimraf ./dist/src",
     "postbuild": "npx shx cp ./package.json ./README.md ./LICENSE ./dist/",
     "verify-publish-directory": "node -e 'if (!process.cwd().endsWith(\"dist\")) { console.error(\"Packaging/Publishing should be done from ./dist/\"); process.exitCode = 1; } process.exit();'",
     "prepack": "npm run verify-publish-directory",
     "prepublishOnly": "npm run verify-publish-directory",
-    "prepublish": "husky install"
+    "prepublish": "husky"
   },
   "dependencies": {
-    "ajv": "^8.1.0",
+    "ajv": "^8.17.1",
+    "ajv-formats": "^3.0.1",
     "js-yaml": "^4.1.0"
   },
   "devDependencies": {
-    "@apidevtools/json-schema-ref-parser": "^9.0.7",
-    "@dtsgenerator/replace-namespace": "^1.4.1",
-    "@rollup/plugin-commonjs": "^19.0.0",
-    "@rollup/plugin-json": "^4.1.0",
-    "@rollup/plugin-node-resolve": "^13.0.0",
-    "@types/jasmine": "^3.6.10",
-    "@types/js-yaml": "^4.0.1",
-    "@types/node-fetch": "^2.5.10",
-    "@types/rimraf": "^3.0.0",
-    "@types/yargs": "^16.0.1",
-    "@typescript-eslint/eslint-plugin": "^4.23.0",
-    "@typescript-eslint/parser": "^4.23.0",
-    "dtsgenerator": "^3.10.0",
-    "eslint": "^7.26.0",
-    "eslint-config-prettier": "^8.3.0",
-    "eslint-plugin-prettier": "^3.4.0",
-    "husky": "6.0.0",
-    "jasmine": "^3.7.0",
-    "lint-staged": "11.0.0",
-    "node-fetch": "^2.6.1",
-    "prettier": "^2.3.0",
-    "rimraf": "^3.0.2",
-    "rollup": "^2.47.0",
+    "@apidevtools/json-schema-ref-parser": "^11.6.4",
+    "@rollup/plugin-commonjs": "^26.0.1",
+    "@rollup/plugin-json": "^6.1.0",
+    "@rollup/plugin-node-resolve": "^15.2.3",
+    "@types/jest": "^29.5.12",
+    "@types/js-yaml": "^4.0.9",
+    "@types/node-fetch": "^2.6.11",
+    "@types/rimraf": "^4.0.5",
+    "@types/yargs": "^17.0.32",
+    "@typescript-eslint/eslint-plugin": "^7.16.1",
+    "@typescript-eslint/parser": "^7.16.1",
+    "eslint": "^8.57.0",
+    "eslint-config-prettier": "^9.1.0",
+    "eslint-plugin-prettier": "^5.1.3",
+    "husky": "^9.0.11",
+    "jest": "^29.7.0",
+    "json-schema-to-typescript": "^15.0.2",
+    "lint-staged": "^15.2.7",
+    "node-fetch": "^3.3.2",
+    "prettier": "^3.3.3",
+    "rimraf": "^6.0.1",
+    "rollup": "^2.79.1",
     "rollup-plugin-sourcemaps": "^0.6.3",
     "rollup-plugin-terser": "^7.0.2",
-    "rollup-plugin-typescript2": "^0.30.0",
-    "shx": "^0.3.3",
-    "ts-node": "^9.1.1",
-    "typescript": "^4.2.4",
-    "yargs": "^17.0.1"
+    "rollup-plugin-typescript2": "^0.36.0",
+    "shx": "^0.3.4",
+    "ts-inference-check": "^0.3.0",
+    "ts-jest": "^29.2.2",
+    "ts-morph": "^23.0.0",
+    "ts-node": "^10.9.2",
+    "typescript": "^5.5.3",
+    "yargs": "^17.7.2"
   },
   "repository": {
     "type": "git",
@@ -82,7 +87,7 @@
   },
   "homepage": "https://serverlessworkflow.io",
   "engines": {
-    "node": ">=15.0",
-    "npm": ">=7.0.0"
+    "node": ">=20.0",
+    "npm": ">=10.0.0"
   }
 }
diff --git a/src/index.ts b/src/index.ts
index 26bdf5cd..c957c397 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,17 +1 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
 export * from './serverless-workflow-sdk';
diff --git a/src/lib/builder.ts b/src/lib/builder.ts
index 50347298..5e8321bc 100644
--- a/src/lib/builder.ts
+++ b/src/lib/builder.ts
@@ -9,38 +9,95 @@
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * oUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
+ *
  */
 
 /**
- * Represents a builder proxy
+ * Represents the options passed to the `build()` method
+ */
+export type BuildOptions = {
+  /**
+   * Default true
+   */
+  validate?: boolean;
+  /**
+   * Default true
+   */
+  normalize?: boolean;
+};
+
+/**
+ * The type of the underlying function called on `build()` for objects
  */
-export type Builder = {
-  build: () => T;
+export type BuildingFunction = (model: Partial, options: BuildOptions) => TBuilt;
+
+/**
+ * The type of the underlying function called on `build()` for arrays
+ */
+export type ArrayBuildingFunction = (model: Array, options: BuildOptions) => TBuilt;
+
+/**
+ * Represents a fluent builder proxy for an object
+ */
+export type Builder = {
+  build: (option?: BuildOptions) => TBuilt;
 } & {
-  [k in T extends T ? keyof T : never]-?: (arg: T[k]) => Builder;
+  [K in keyof TSpec]-?: (arg: TSpec[K]) => Builder;
+};
+
+/**
+ * Represents a fluent builder proxy for an array
+ */
+export type ArrayBuilder = {
+  push: (item: TSpec) => ArrayBuilder;
+  build: (option?: BuildOptions) => TBuilt;
 };
 
 /**
- * A factory for builders that proxy properties assignations and validate against schema on build
- * @param {Function} buildingFn The function used to validate and produce the object on build()
- * @returns {Builder} A builder proxy
+ * The default function used to build an object, basically just return the provided object
+ * @param model The object to "build"
+ * @param options The build options
+ * @returns
  */
-export function builder(buildingFn?: (data: Partial) => () => T): Builder {
-  const data: Partial = {};
-  const defaultBuildingFn =
-    (data: Partial): (() => T) =>
-    () =>
-      data as T;
-  const proxy = new Proxy({} as Builder, {
+function defaultBuildingFn(model: Partial, options: BuildOptions): TBuilt {
+  // prevents @typescript-eslint/no-unused-vars ...
+  if (options.validate == null) {
+    options.validate = true;
+  }
+  if (options.normalize == null) {
+    options.normalize = true;
+  }
+  return model as TBuilt;
+}
+
+/**
+ * A factory for fluent builders that proxy properties assignations and can validate against schema on build()
+ * @param buildingFn The function used to validate and produce the object on build()
+ * @returns A fluent builder
+ */
+export function builder(
+  model: Partial = {},
+  buildingFn: BuildingFunction = defaultBuildingFn,
+): Builder {
+  const proxy = new Proxy({} as Builder, {
     get: (_, prop) => {
       if (prop === 'build') {
-        return (buildingFn || defaultBuildingFn)(data);
+        return (options?: BuildOptions) => {
+          options = options || ({} as BuildOptions);
+          if (options.validate == null) {
+            options.validate = true;
+          }
+          if (options.normalize == null) {
+            options.normalize = true;
+          }
+          return buildingFn(model, options);
+        };
       }
-      return (value: unknown): Builder => {
-        (data as any)[prop.toString()] = value;
+      return (value: unknown): Builder => {
+        (model as any)[prop.toString()] = value;
         return proxy;
       };
     },
@@ -50,3 +107,43 @@ export function builder(buildingFn?: (data: Partial) => () => T): Builder<
   });
   return proxy;
 }
+
+/**
+ * A factory for fluent builders that proxy properties assignations and can validate against schema on build()
+ * @param buildingFn The function used to validate and produce the object on build()
+ * @returns A fluent builder
+ */
+export function arrayBuilder(
+  model: Array = [],
+  buildingFn: ArrayBuildingFunction = defaultBuildingFn,
+): ArrayBuilder {
+  if (model != null && !Array.isArray(model)) {
+    throw new Error(`The provided model should be an array`);
+  }
+  const proxy = new Proxy({} as ArrayBuilder, {
+    get: (_, prop) => {
+      if (prop === 'build') {
+        return (options?: BuildOptions) => {
+          options = options || ({} as BuildOptions);
+          if (options.validate == null) {
+            options.validate = true;
+          }
+          if (options.normalize == null) {
+            options.normalize = true;
+          }
+          return buildingFn(model, options);
+        };
+      }
+      if (prop === 'push') {
+        return (value: TSpec): ArrayBuilder => {
+          model.push(value);
+          return proxy;
+        };
+      }
+    },
+    set: () => {
+      return false;
+    },
+  });
+  return proxy;
+}
diff --git a/src/lib/builders/action-builder.ts b/src/lib/builders/action-builder.ts
deleted file mode 100644
index 4502e9d1..00000000
--- a/src/lib/builders/action-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Action} data The underlying object
- * @returns {Specification.Action} The validated underlying object
- */
-function actionBuildingFn(data: Specification.Action): () => Specification.Action {
-  return () => {
-    const model = new Specification.Action(data);
-
-    validate('Action', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Action`
- * @returns {Specification.Action} A builder for `Specification.Action`
- */
-export function actionBuilder(): Builder {
-  return builder(actionBuildingFn);
-}
diff --git a/src/lib/builders/actiondatafilter-builder.ts b/src/lib/builders/actiondatafilter-builder.ts
deleted file mode 100644
index c9f74ea0..00000000
--- a/src/lib/builders/actiondatafilter-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Actiondatafilter} data The underlying object
- * @returns {Specification.Actiondatafilter} The validated underlying object
- */
-function actiondatafilterBuildingFn(data: Specification.Actiondatafilter): () => Specification.Actiondatafilter {
-  return () => {
-    const model = new Specification.Actiondatafilter(data);
-
-    validate('Actiondatafilter', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Actiondatafilter`
- * @returns {Specification.Actiondatafilter} A builder for `Specification.Actiondatafilter`
- */
-export function actiondatafilterBuilder(): Builder {
-  return builder(actiondatafilterBuildingFn);
-}
diff --git a/src/lib/builders/authdef-builder.ts b/src/lib/builders/authdef-builder.ts
deleted file mode 100644
index 2482124b..00000000
--- a/src/lib/builders/authdef-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Authdef} data The underlying object
- * @returns {Specification.Authdef} The validated underlying object
- */
-function authdefBuildingFn(data: Specification.Authdef): () => Specification.Authdef {
-  return () => {
-    const model = new Specification.Authdef(data);
-
-    validate('Authdef', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Authdef`
- * @returns {Specification.Authdef} A builder for `Specification.Authdef`
- */
-export function authdefBuilder(): Builder {
-  return builder(authdefBuildingFn);
-}
diff --git a/src/lib/builders/basicpropsdef-builder.ts b/src/lib/builders/basicpropsdef-builder.ts
deleted file mode 100644
index d12618e8..00000000
--- a/src/lib/builders/basicpropsdef-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Basicpropsdef} data The underlying object
- * @returns {Specification.Basicpropsdef} The validated underlying object
- */
-function basicpropsdefBuildingFn(data: Specification.Basicpropsdef): () => Specification.Basicpropsdef {
-  return () => {
-    const model = new Specification.Basicpropsdef(data);
-
-    validate('Basicpropsdef', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Basicpropsdef`
- * @returns {Specification.Basicpropsdef} A builder for `Specification.Basicpropsdef`
- */
-export function basicpropsdefBuilder(): Builder {
-  return builder(basicpropsdefBuildingFn);
-}
diff --git a/src/lib/builders/bearerpropsdef-builder.ts b/src/lib/builders/bearerpropsdef-builder.ts
deleted file mode 100644
index c77f1ac3..00000000
--- a/src/lib/builders/bearerpropsdef-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Bearerpropsdef} data The underlying object
- * @returns {Specification.Bearerpropsdef} The validated underlying object
- */
-function bearerpropsdefBuildingFn(data: Specification.Bearerpropsdef): () => Specification.Bearerpropsdef {
-  return () => {
-    const model = new Specification.Bearerpropsdef(data);
-
-    validate('Bearerpropsdef', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Bearerpropsdef`
- * @returns {Specification.Bearerpropsdef} A builder for `Specification.Bearerpropsdef`
- */
-export function bearerpropsdefBuilder(): Builder {
-  return builder(bearerpropsdefBuildingFn);
-}
diff --git a/src/lib/builders/branch-builder.ts b/src/lib/builders/branch-builder.ts
deleted file mode 100644
index 1bdb64f0..00000000
--- a/src/lib/builders/branch-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Branch} data The underlying object
- * @returns {Specification.Branch} The validated underlying object
- */
-function branchBuildingFn(data: Specification.Branch): () => Specification.Branch {
-  return () => {
-    const model = new Specification.Branch(data);
-
-    validate('Branch', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Branch`
- * @returns {Specification.Branch} A builder for `Specification.Branch`
- */
-export function branchBuilder(): Builder {
-  return builder(branchBuildingFn);
-}
diff --git a/src/lib/builders/callbackstate-builder.ts b/src/lib/builders/callbackstate-builder.ts
deleted file mode 100644
index b7e290c0..00000000
--- a/src/lib/builders/callbackstate-builder.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-import { setEndValueIfNoTransition } from '../definitions/utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Callbackstate} data The underlying object
- * @returns {Specification.Callbackstate} The validated underlying object
- */
-function callbackstateBuildingFn(data: Specification.Callbackstate): () => Specification.Callbackstate {
-  return () => {
-    const model = new Specification.Callbackstate(data);
-
-    setEndValueIfNoTransition(model);
-
-    validate('Callbackstate', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Callbackstate`
- * @returns {Specification.Callbackstate} A builder for `Specification.Callbackstate`
- */
-export function callbackstateBuilder(): Builder {
-  return builder(callbackstateBuildingFn);
-}
diff --git a/src/lib/builders/continueasdef-builder.ts b/src/lib/builders/continueasdef-builder.ts
deleted file mode 100644
index ce86edce..00000000
--- a/src/lib/builders/continueasdef-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Continueasdef} data The underlying object
- * @returns {Specification.Continueasdef} The validated underlying object
- */
-function continueasdefBuildingFn(data: Specification.Continueasdef): () => Specification.Continueasdef {
-  return () => {
-    const model = new Specification.Continueasdef(data);
-
-    validate('Continueasdef', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Continueasdef`
- * @returns {Specification.Continueasdef} A builder for `Specification.Continueasdef`
- */
-export function continueasdefBuilder(): Builder {
-  return builder(continueasdefBuildingFn);
-}
diff --git a/src/lib/builders/correlation-def-builder.ts b/src/lib/builders/correlation-def-builder.ts
deleted file mode 100644
index 3e15e621..00000000
--- a/src/lib/builders/correlation-def-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.CorrelationDef} data The underlying object
- * @returns {Specification.CorrelationDef} The validated underlying object
- */
-function correlationDefBuildingFn(data: Specification.CorrelationDef): () => Specification.CorrelationDef {
-  return () => {
-    const model = new Specification.CorrelationDef(data);
-
-    validate('CorrelationDef', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.CorrelationDef`
- * @returns {Specification.CorrelationDef} A builder for `Specification.CorrelationDef`
- */
-export function correlationDefBuilder(): Builder {
-  return builder(correlationDefBuildingFn);
-}
diff --git a/src/lib/builders/crondef-builder.ts b/src/lib/builders/crondef-builder.ts
deleted file mode 100644
index 3521c55b..00000000
--- a/src/lib/builders/crondef-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Crondef} data The underlying object
- * @returns {Specification.Crondef} The validated underlying object
- */
-function crondefBuildingFn(data: Specification.Crondef): () => Specification.Crondef {
-  return () => {
-    const model = new Specification.Crondef(data);
-
-    validate('Crondef', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Crondef`
- * @returns {Specification.Crondef} A builder for `Specification.Crondef`
- */
-export function crondefBuilder(): Builder {
-  return builder(crondefBuildingFn);
-}
diff --git a/src/lib/builders/databasedswitch-builder.ts b/src/lib/builders/databasedswitch-builder.ts
deleted file mode 100644
index d883f20a..00000000
--- a/src/lib/builders/databasedswitch-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Databasedswitch} data The underlying object
- * @returns {Specification.Databasedswitch} The validated underlying object
- */
-function databasedswitchBuildingFn(data: Specification.Databasedswitch): () => Specification.Databasedswitch {
-  return () => {
-    const model = new Specification.Databasedswitch(data);
-
-    validate('Databasedswitch', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Databasedswitch`
- * @returns {Specification.Databasedswitch} A builder for `Specification.Databasedswitch`
- */
-export function databasedswitchBuilder(): Builder {
-  return builder(databasedswitchBuildingFn);
-}
diff --git a/src/lib/builders/defaultconditiondef-builder.ts b/src/lib/builders/defaultconditiondef-builder.ts
deleted file mode 100644
index 81a1a84a..00000000
--- a/src/lib/builders/defaultconditiondef-builder.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Defaultconditiondef} data The underlying object
- * @returns {Specification.Defaultconditiondef} The validated underlying object
- */
-function defaultconditiondefBuildingFn(
-  data: Specification.Defaultconditiondef
-): () => Specification.Defaultconditiondef {
-  return () => {
-    const model = new Specification.Defaultconditiondef(data);
-
-    validate('Defaultconditiondef', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Defaultconditiondef`
- * @returns {Specification.Defaultconditiondef} A builder for `Specification.Defaultconditiondef`
- */
-export function defaultconditiondefBuilder(): Builder {
-  return builder(defaultconditiondefBuildingFn);
-}
diff --git a/src/lib/builders/end-builder.ts b/src/lib/builders/end-builder.ts
deleted file mode 100644
index c4b1a7a2..00000000
--- a/src/lib/builders/end-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.End} data The underlying object
- * @returns {Specification.End} The validated underlying object
- */
-function endBuildingFn(data: Specification.End): () => Specification.End {
-  return () => {
-    const model = new Specification.End(data);
-
-    validate('End', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.End`
- * @returns {Specification.End} A builder for `Specification.End`
- */
-export function endBuilder(): Builder {
-  return builder(endBuildingFn);
-}
diff --git a/src/lib/builders/enddatacondition-builder.ts b/src/lib/builders/enddatacondition-builder.ts
deleted file mode 100644
index 23404678..00000000
--- a/src/lib/builders/enddatacondition-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Enddatacondition} data The underlying object
- * @returns {Specification.Enddatacondition} The validated underlying object
- */
-function enddataconditionBuildingFn(data: Specification.Enddatacondition): () => Specification.Enddatacondition {
-  return () => {
-    const model = new Specification.Enddatacondition(data);
-
-    validate('Enddatacondition', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Enddatacondition`
- * @returns {Specification.Enddatacondition} A builder for `Specification.Enddatacondition`
- */
-export function enddataconditionBuilder(): Builder {
-  return builder(enddataconditionBuildingFn);
-}
diff --git a/src/lib/builders/enddeventcondition-builder.ts b/src/lib/builders/enddeventcondition-builder.ts
deleted file mode 100644
index 1c4fdaee..00000000
--- a/src/lib/builders/enddeventcondition-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Enddeventcondition} data The underlying object
- * @returns {Specification.Enddeventcondition} The validated underlying object
- */
-function enddeventconditionBuildingFn(data: Specification.Enddeventcondition): () => Specification.Enddeventcondition {
-  return () => {
-    const model = new Specification.Enddeventcondition(data);
-
-    validate('Enddeventcondition', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Enddeventcondition`
- * @returns {Specification.Enddeventcondition} A builder for `Specification.Enddeventcondition`
- */
-export function enddeventconditionBuilder(): Builder {
-  return builder(enddeventconditionBuildingFn);
-}
diff --git a/src/lib/builders/error-builder.ts b/src/lib/builders/error-builder.ts
deleted file mode 100644
index 5d6a5767..00000000
--- a/src/lib/builders/error-builder.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-import { setEndValueIfNoTransition } from '../definitions/utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Error} data The underlying object
- * @returns {Specification.Error} The validated underlying object
- */
-function errorBuildingFn(data: Specification.Error): () => Specification.Error {
-  return () => {
-    const model = new Specification.Error(data);
-
-    setEndValueIfNoTransition(model);
-
-    validate('Error', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Error`
- * @returns {Specification.Error} A builder for `Specification.Error`
- */
-export function errorBuilder(): Builder {
-  return builder(errorBuildingFn);
-}
diff --git a/src/lib/builders/errordef-builder.ts b/src/lib/builders/errordef-builder.ts
deleted file mode 100644
index 8abaa2f9..00000000
--- a/src/lib/builders/errordef-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Errordef} data The underlying object
- * @returns {Specification.Errordef} The validated underlying object
- */
-function errordefBuildingFn(data: Specification.Errordef): () => Specification.Errordef {
-  return () => {
-    const model = new Specification.Errordef(data);
-
-    validate('Errordef', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Errordef`
- * @returns {Specification.Errordef} A builder for `Specification.Errordef`
- */
-export function errordefBuilder(): Builder {
-  return builder(errordefBuildingFn);
-}
diff --git a/src/lib/builders/eventbasedswitch-builder.ts b/src/lib/builders/eventbasedswitch-builder.ts
deleted file mode 100644
index d95741dd..00000000
--- a/src/lib/builders/eventbasedswitch-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Eventbasedswitch} data The underlying object
- * @returns {Specification.Eventbasedswitch} The validated underlying object
- */
-function eventbasedswitchBuildingFn(data: Specification.Eventbasedswitch): () => Specification.Eventbasedswitch {
-  return () => {
-    const model = new Specification.Eventbasedswitch(data);
-
-    validate('Eventbasedswitch', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Eventbasedswitch`
- * @returns {Specification.Eventbasedswitch} A builder for `Specification.Eventbasedswitch`
- */
-export function eventbasedswitchBuilder(): Builder {
-  return builder(eventbasedswitchBuildingFn);
-}
diff --git a/src/lib/builders/eventdatafilter-builder.ts b/src/lib/builders/eventdatafilter-builder.ts
deleted file mode 100644
index 6bf36387..00000000
--- a/src/lib/builders/eventdatafilter-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Eventdatafilter} data The underlying object
- * @returns {Specification.Eventdatafilter} The validated underlying object
- */
-function eventdatafilterBuildingFn(data: Specification.Eventdatafilter): () => Specification.Eventdatafilter {
-  return () => {
-    const model = new Specification.Eventdatafilter(data);
-
-    validate('Eventdatafilter', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Eventdatafilter`
- * @returns {Specification.Eventdatafilter} A builder for `Specification.Eventdatafilter`
- */
-export function eventdatafilterBuilder(): Builder {
-  return builder(eventdatafilterBuildingFn);
-}
diff --git a/src/lib/builders/eventdef-builder.ts b/src/lib/builders/eventdef-builder.ts
deleted file mode 100644
index 2694e086..00000000
--- a/src/lib/builders/eventdef-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Eventdef} data The underlying object
- * @returns {Specification.Eventdef} The validated underlying object
- */
-function eventdefBuildingFn(data: Specification.Eventdef): () => Specification.Eventdef {
-  return () => {
-    const model = new Specification.Eventdef(data);
-
-    validate('Eventdef', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Eventdef`
- * @returns {Specification.Eventdef} A builder for `Specification.Eventdef`
- */
-export function eventdefBuilder(): Builder {
-  return builder(eventdefBuildingFn);
-}
diff --git a/src/lib/builders/eventref-builder.ts b/src/lib/builders/eventref-builder.ts
deleted file mode 100644
index 9eabeb61..00000000
--- a/src/lib/builders/eventref-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Eventref} data The underlying object
- * @returns {Specification.Eventref} The validated underlying object
- */
-function eventrefBuildingFn(data: Specification.Eventref): () => Specification.Eventref {
-  return () => {
-    const model = new Specification.Eventref(data);
-
-    validate('Eventref', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Eventref`
- * @returns {Specification.Eventref} A builder for `Specification.Eventref`
- */
-export function eventrefBuilder(): Builder {
-  return builder(eventrefBuildingFn);
-}
diff --git a/src/lib/builders/eventstate-builder.ts b/src/lib/builders/eventstate-builder.ts
deleted file mode 100644
index 95374dba..00000000
--- a/src/lib/builders/eventstate-builder.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-import { setEndValueIfNoTransition } from '../definitions/utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Eventstate} data The underlying object
- * @returns {Specification.Eventstate} The validated underlying object
- */
-function eventstateBuildingFn(data: Specification.Eventstate): () => Specification.Eventstate {
-  return () => {
-    const model = new Specification.Eventstate(data);
-
-    setEndValueIfNoTransition(model);
-
-    validate('Eventstate', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Eventstate`
- * @returns {Specification.Eventstate} A builder for `Specification.Eventstate`
- */
-export function eventstateBuilder(): Builder {
-  return builder(eventstateBuildingFn);
-}
diff --git a/src/lib/builders/foreachstate-builder.ts b/src/lib/builders/foreachstate-builder.ts
deleted file mode 100644
index 9c54594c..00000000
--- a/src/lib/builders/foreachstate-builder.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-import { setEndValueIfNoTransition } from '../definitions/utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Foreachstate} data The underlying object
- * @returns {Specification.Foreachstate} The validated underlying object
- */
-function foreachstateBuildingFn(data: Specification.Foreachstate): () => Specification.Foreachstate {
-  return () => {
-    const model = new Specification.Foreachstate(data);
-
-    setEndValueIfNoTransition(model);
-
-    validate('Foreachstate', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Foreachstate`
- * @returns {Specification.Foreachstate} A builder for `Specification.Foreachstate`
- */
-export function foreachstateBuilder(): Builder {
-  return builder(foreachstateBuildingFn);
-}
diff --git a/src/lib/builders/function-builder.ts b/src/lib/builders/function-builder.ts
deleted file mode 100644
index 347786fc..00000000
--- a/src/lib/builders/function-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Function} data The underlying object
- * @returns {Specification.Function} The validated underlying object
- */
-function functionBuildingFn(data: Specification.Function): () => Specification.Function {
-  return () => {
-    const model = new Specification.Function(data);
-
-    validate('Function', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Function`
- * @returns {Specification.Function} A builder for `Specification.Function`
- */
-export function functionBuilder(): Builder {
-  return builder(functionBuildingFn);
-}
diff --git a/src/lib/builders/functionref-builder.ts b/src/lib/builders/functionref-builder.ts
deleted file mode 100644
index e5337bb9..00000000
--- a/src/lib/builders/functionref-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Functionref} data The underlying object
- * @returns {Specification.Functionref} The validated underlying object
- */
-function functionrefBuildingFn(data: Specification.Functionref): () => Specification.Functionref {
-  return () => {
-    const model = new Specification.Functionref(data);
-
-    validate('Functionref', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Functionref`
- * @returns {Specification.Functionref} A builder for `Specification.Functionref`
- */
-export function functionrefBuilder(): Builder {
-  return builder(functionrefBuildingFn);
-}
diff --git a/src/lib/builders/index.ts b/src/lib/builders/index.ts
deleted file mode 100644
index df214ba2..00000000
--- a/src/lib/builders/index.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-export * from './workflow-builder';
-export * from './action-builder';
-export * from './actiondatafilter-builder';
-export * from './authdef-builder';
-export * from './basicpropsdef-builder';
-export * from './bearerpropsdef-builder';
-export * from './branch-builder';
-export * from './callbackstate-builder';
-export * from './continueasdef-builder';
-export * from './correlation-def-builder';
-export * from './crondef-builder';
-export * from './databasedswitch-builder';
-export * from './defaultconditiondef-builder';
-export * from './end-builder';
-export * from './enddatacondition-builder';
-export * from './enddeventcondition-builder';
-export * from './error-builder';
-export * from './errordef-builder';
-export * from './eventbasedswitch-builder';
-export * from './eventdatafilter-builder';
-export * from './eventdef-builder';
-export * from './eventref-builder';
-export * from './eventstate-builder';
-export * from './foreachstate-builder';
-export * from './function-builder';
-export * from './functionref-builder';
-export * from './injectstate-builder';
-export * from './metadata-builder';
-export * from './oauth2propsdef-builder';
-export * from './onevents-builder';
-export * from './operationstate-builder';
-export * from './parallelstate-builder';
-export * from './produceeventdef-builder';
-export * from './retrydef-builder';
-export * from './schedule-builder';
-export * from './sleep-builder';
-export * from './sleepstate-builder';
-export * from './startdef-builder';
-export * from './state-exec-timeout-builder';
-export * from './statedatafilter-builder';
-export * from './subflowref-builder';
-export * from './timeouts-builder';
-export * from './transition-builder';
-export * from './transitiondatacondition-builder';
-export * from './transitioneventcondition-builder';
-export * from './workflow-exec-timeout-builder';
diff --git a/src/lib/builders/injectstate-builder.ts b/src/lib/builders/injectstate-builder.ts
deleted file mode 100644
index 10ef831d..00000000
--- a/src/lib/builders/injectstate-builder.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-import { setEndValueIfNoTransition } from '../definitions/utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Injectstate} data The underlying object
- * @returns {Specification.Injectstate} The validated underlying object
- */
-function injectstateBuildingFn(data: Specification.Injectstate): () => Specification.Injectstate {
-  return () => {
-    const model = new Specification.Injectstate(data);
-
-    setEndValueIfNoTransition(model);
-
-    validate('Injectstate', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Injectstate`
- * @returns {Specification.Injectstate} A builder for `Specification.Injectstate`
- */
-export function injectstateBuilder(): Builder {
-  return builder(injectstateBuildingFn);
-}
diff --git a/src/lib/builders/metadata-builder.ts b/src/lib/builders/metadata-builder.ts
deleted file mode 100644
index acc9db1e..00000000
--- a/src/lib/builders/metadata-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Metadata} data The underlying object
- * @returns {Specification.Metadata} The validated underlying object
- */
-function metadataBuildingFn(data: Specification.Metadata): () => Specification.Metadata {
-  return () => {
-    const model = new Specification.Metadata(data);
-
-    validate('Metadata', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Metadata`
- * @returns {Specification.Metadata} A builder for `Specification.Metadata`
- */
-export function metadataBuilder(): Builder {
-  return builder(metadataBuildingFn);
-}
diff --git a/src/lib/builders/oauth2propsdef-builder.ts b/src/lib/builders/oauth2propsdef-builder.ts
deleted file mode 100644
index 780a99ab..00000000
--- a/src/lib/builders/oauth2propsdef-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Oauth2propsdef} data The underlying object
- * @returns {Specification.Oauth2propsdef} The validated underlying object
- */
-function oauth2propsdefBuildingFn(data: Specification.Oauth2propsdef): () => Specification.Oauth2propsdef {
-  return () => {
-    const model = new Specification.Oauth2propsdef(data);
-
-    validate('Oauth2propsdef', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Oauth2propsdef`
- * @returns {Specification.Oauth2propsdef} A builder for `Specification.Oauth2propsdef`
- */
-export function oauth2propsdefBuilder(): Builder {
-  return builder(oauth2propsdefBuildingFn);
-}
diff --git a/src/lib/builders/onevents-builder.ts b/src/lib/builders/onevents-builder.ts
deleted file mode 100644
index ef03c257..00000000
--- a/src/lib/builders/onevents-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Onevents} data The underlying object
- * @returns {Specification.Onevents} The validated underlying object
- */
-function oneventsBuildingFn(data: Specification.Onevents): () => Specification.Onevents {
-  return () => {
-    const model = new Specification.Onevents(data);
-
-    validate('Onevents', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Onevents`
- * @returns {Specification.Onevents} A builder for `Specification.Onevents`
- */
-export function oneventsBuilder(): Builder {
-  return builder(oneventsBuildingFn);
-}
diff --git a/src/lib/builders/operationstate-builder.ts b/src/lib/builders/operationstate-builder.ts
deleted file mode 100644
index 65c4dfe6..00000000
--- a/src/lib/builders/operationstate-builder.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-import { setEndValueIfNoTransition } from '../definitions/utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Operationstate} data The underlying object
- * @returns {Specification.Operationstate} The validated underlying object
- */
-function operationstateBuildingFn(data: Specification.Operationstate): () => Specification.Operationstate {
-  return () => {
-    const model = new Specification.Operationstate(data);
-
-    setEndValueIfNoTransition(model);
-
-    validate('Operationstate', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Operationstate`
- * @returns {Specification.Operationstate} A builder for `Specification.Operationstate`
- */
-export function operationstateBuilder(): Builder {
-  return builder(operationstateBuildingFn);
-}
diff --git a/src/lib/builders/parallelstate-builder.ts b/src/lib/builders/parallelstate-builder.ts
deleted file mode 100644
index 34c7fd9a..00000000
--- a/src/lib/builders/parallelstate-builder.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-import { setEndValueIfNoTransition } from '../definitions/utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Parallelstate} data The underlying object
- * @returns {Specification.Parallelstate} The validated underlying object
- */
-function parallelstateBuildingFn(data: Specification.Parallelstate): () => Specification.Parallelstate {
-  return () => {
-    const model = new Specification.Parallelstate(data);
-
-    setEndValueIfNoTransition(model);
-
-    validate('Parallelstate', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Parallelstate`
- * @returns {Specification.Parallelstate} A builder for `Specification.Parallelstate`
- */
-export function parallelstateBuilder(): Builder {
-  return builder(parallelstateBuildingFn);
-}
diff --git a/src/lib/builders/produceeventdef-builder.ts b/src/lib/builders/produceeventdef-builder.ts
deleted file mode 100644
index ca476710..00000000
--- a/src/lib/builders/produceeventdef-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Produceeventdef} data The underlying object
- * @returns {Specification.Produceeventdef} The validated underlying object
- */
-function produceeventdefBuildingFn(data: Specification.Produceeventdef): () => Specification.Produceeventdef {
-  return () => {
-    const model = new Specification.Produceeventdef(data);
-
-    validate('Produceeventdef', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Produceeventdef`
- * @returns {Specification.Produceeventdef} A builder for `Specification.Produceeventdef`
- */
-export function produceeventdefBuilder(): Builder {
-  return builder(produceeventdefBuildingFn);
-}
diff --git a/src/lib/builders/retrydef-builder.ts b/src/lib/builders/retrydef-builder.ts
deleted file mode 100644
index bbf254cf..00000000
--- a/src/lib/builders/retrydef-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Retrydef} data The underlying object
- * @returns {Specification.Retrydef} The validated underlying object
- */
-function retrydefBuildingFn(data: Specification.Retrydef): () => Specification.Retrydef {
-  return () => {
-    const model = new Specification.Retrydef(data);
-
-    validate('Retrydef', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Retrydef`
- * @returns {Specification.Retrydef} A builder for `Specification.Retrydef`
- */
-export function retrydefBuilder(): Builder {
-  return builder(retrydefBuildingFn);
-}
diff --git a/src/lib/builders/schedule-builder.ts b/src/lib/builders/schedule-builder.ts
deleted file mode 100644
index 54fe3097..00000000
--- a/src/lib/builders/schedule-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Schedule} data The underlying object
- * @returns {Specification.Schedule} The validated underlying object
- */
-function scheduleBuildingFn(data: Specification.Schedule): () => Specification.Schedule {
-  return () => {
-    const model = new Specification.Schedule(data);
-
-    validate('Schedule', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Schedule`
- * @returns {Specification.Schedule} A builder for `Specification.Schedule`
- */
-export function scheduleBuilder(): Builder {
-  return builder(scheduleBuildingFn);
-}
diff --git a/src/lib/builders/sleep-builder.ts b/src/lib/builders/sleep-builder.ts
deleted file mode 100644
index af780040..00000000
--- a/src/lib/builders/sleep-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Sleep} data The underlying object
- * @returns {Specification.Sleep} The validated underlying object
- */
-function sleepBuildingFn(data: Specification.Sleep): () => Specification.Sleep {
-  return () => {
-    const model = new Specification.Sleep(data);
-
-    validate('Sleep', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Sleep`
- * @returns {Specification.Sleep} A builder for `Specification.Sleep`
- */
-export function sleepBuilder(): Builder {
-  return builder(sleepBuildingFn);
-}
diff --git a/src/lib/builders/sleepstate-builder.ts b/src/lib/builders/sleepstate-builder.ts
deleted file mode 100644
index b99751c5..00000000
--- a/src/lib/builders/sleepstate-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Sleepstate} data The underlying object
- * @returns {Specification.Sleepstate} The validated underlying object
- */
-function sleepstateBuildingFn(data: Specification.Sleepstate): () => Specification.Sleepstate {
-  return () => {
-    const model = new Specification.Sleepstate(data);
-
-    validate('Sleepstate', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Sleepstate`
- * @returns {Specification.Sleepstate} A builder for `Specification.Sleepstate`
- */
-export function sleepstateBuilder(): Builder {
-  return builder(sleepstateBuildingFn);
-}
diff --git a/src/lib/builders/startdef-builder.ts b/src/lib/builders/startdef-builder.ts
deleted file mode 100644
index 3ed59f41..00000000
--- a/src/lib/builders/startdef-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Startdef} data The underlying object
- * @returns {Specification.Startdef} The validated underlying object
- */
-function startdefBuildingFn(data: Specification.Startdef): () => Specification.Startdef {
-  return () => {
-    const model = new Specification.Startdef(data);
-
-    validate('Startdef', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Startdef`
- * @returns {Specification.Startdef} A builder for `Specification.Startdef`
- */
-export function startdefBuilder(): Builder {
-  return builder(startdefBuildingFn);
-}
diff --git a/src/lib/builders/state-exec-timeout-builder.ts b/src/lib/builders/state-exec-timeout-builder.ts
deleted file mode 100644
index 4d9b59fe..00000000
--- a/src/lib/builders/state-exec-timeout-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.StateExecTimeout} data The underlying object
- * @returns {Specification.StateExecTimeout} The validated underlying object
- */
-function stateExecTimeoutBuildingFn(data: Specification.StateExecTimeout): () => Specification.StateExecTimeout {
-  return () => {
-    const model = new Specification.StateExecTimeout(data);
-
-    validate('StateExecTimeout', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.StateExecTimeout`
- * @returns {Specification.StateExecTimeout} A builder for `Specification.StateExecTimeout`
- */
-export function stateExecTimeoutBuilder(): Builder {
-  return builder(stateExecTimeoutBuildingFn);
-}
diff --git a/src/lib/builders/statedatafilter-builder.ts b/src/lib/builders/statedatafilter-builder.ts
deleted file mode 100644
index a3e3246c..00000000
--- a/src/lib/builders/statedatafilter-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Statedatafilter} data The underlying object
- * @returns {Specification.Statedatafilter} The validated underlying object
- */
-function statedatafilterBuildingFn(data: Specification.Statedatafilter): () => Specification.Statedatafilter {
-  return () => {
-    const model = new Specification.Statedatafilter(data);
-
-    validate('Statedatafilter', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Statedatafilter`
- * @returns {Specification.Statedatafilter} A builder for `Specification.Statedatafilter`
- */
-export function statedatafilterBuilder(): Builder {
-  return builder(statedatafilterBuildingFn);
-}
diff --git a/src/lib/builders/subflowref-builder.ts b/src/lib/builders/subflowref-builder.ts
deleted file mode 100644
index d2cffce7..00000000
--- a/src/lib/builders/subflowref-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Subflowref} data The underlying object
- * @returns {Specification.Subflowref} The validated underlying object
- */
-function subflowrefBuildingFn(data: Specification.Subflowref): () => Specification.Subflowref {
-  return () => {
-    const model = new Specification.Subflowref(data);
-
-    validate('Subflowref', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Subflowref`
- * @returns {Specification.Subflowref} A builder for `Specification.Subflowref`
- */
-export function subflowrefBuilder(): Builder {
-  return builder(subflowrefBuildingFn);
-}
diff --git a/src/lib/builders/timeouts-builder.ts b/src/lib/builders/timeouts-builder.ts
deleted file mode 100644
index e1242359..00000000
--- a/src/lib/builders/timeouts-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Timeouts} data The underlying object
- * @returns {Specification.Timeouts} The validated underlying object
- */
-function timeoutsBuildingFn(data: Specification.Timeouts): () => Specification.Timeouts {
-  return () => {
-    const model = new Specification.Timeouts(data);
-
-    validate('Timeouts', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Timeouts`
- * @returns {Specification.Timeouts} A builder for `Specification.Timeouts`
- */
-export function timeoutsBuilder(): Builder {
-  return builder(timeoutsBuildingFn);
-}
diff --git a/src/lib/builders/transition-builder.ts b/src/lib/builders/transition-builder.ts
deleted file mode 100644
index a60fa651..00000000
--- a/src/lib/builders/transition-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Transition} data The underlying object
- * @returns {Specification.Transition} The validated underlying object
- */
-function transitionBuildingFn(data: Specification.Transition): () => Specification.Transition {
-  return () => {
-    const model = new Specification.Transition(data);
-
-    validate('Transition', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Transition`
- * @returns {Specification.Transition} A builder for `Specification.Transition`
- */
-export function transitionBuilder(): Builder {
-  return builder(transitionBuildingFn);
-}
diff --git a/src/lib/builders/transitiondatacondition-builder.ts b/src/lib/builders/transitiondatacondition-builder.ts
deleted file mode 100644
index 0d9e1b18..00000000
--- a/src/lib/builders/transitiondatacondition-builder.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Transitiondatacondition} data The underlying object
- * @returns {Specification.Transitiondatacondition} The validated underlying object
- */
-function transitiondataconditionBuildingFn(
-  data: Specification.Transitiondatacondition
-): () => Specification.Transitiondatacondition {
-  return () => {
-    const model = new Specification.Transitiondatacondition(data);
-
-    validate('Transitiondatacondition', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Transitiondatacondition`
- * @returns {Specification.Transitiondatacondition} A builder for `Specification.Transitiondatacondition`
- */
-export function transitiondataconditionBuilder(): Builder {
-  return builder(transitiondataconditionBuildingFn);
-}
diff --git a/src/lib/builders/transitioneventcondition-builder.ts b/src/lib/builders/transitioneventcondition-builder.ts
deleted file mode 100644
index c38bcb5e..00000000
--- a/src/lib/builders/transitioneventcondition-builder.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Transitioneventcondition} data The underlying object
- * @returns {Specification.Transitioneventcondition} The validated underlying object
- */
-function transitioneventconditionBuildingFn(
-  data: Specification.Transitioneventcondition
-): () => Specification.Transitioneventcondition {
-  return () => {
-    const model = new Specification.Transitioneventcondition(data);
-
-    validate('Transitioneventcondition', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Transitioneventcondition`
- * @returns {Specification.Transitioneventcondition} A builder for `Specification.Transitioneventcondition`
- */
-export function transitioneventconditionBuilder(): Builder {
-  return builder(transitioneventconditionBuildingFn);
-}
diff --git a/src/lib/builders/workflow-builder.ts b/src/lib/builders/workflow-builder.ts
deleted file mode 100644
index e4364d90..00000000
--- a/src/lib/builders/workflow-builder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.Workflow} data The underlying object
- * @returns {Specification.Workflow} The validated underlying object
- */
-function workflowBuildingFn(data: Specification.Workflow): () => Specification.Workflow {
-  return () => {
-    const model = new Specification.Workflow(data);
-
-    validate('Workflow', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.Workflow`
- * @returns {Specification.Workflow} A builder for `Specification.Workflow`
- */
-export function workflowBuilder(): Builder {
-  return builder(workflowBuildingFn);
-}
diff --git a/src/lib/builders/workflow-exec-timeout-builder.ts b/src/lib/builders/workflow-exec-timeout-builder.ts
deleted file mode 100644
index 9e7d6133..00000000
--- a/src/lib/builders/workflow-exec-timeout-builder.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Builder, builder } from '../builder';
-import { Specification } from '../definitions';
-import { validate } from '../utils';
-
-/**
- * The internal function used by the builder proxy to validate and return its underlying object
- * @param {Specification.WorkflowExecTimeout} data The underlying object
- * @returns {Specification.WorkflowExecTimeout} The validated underlying object
- */
-function workflowExecTimeoutBuildingFn(
-  data: Specification.WorkflowExecTimeout
-): () => Specification.WorkflowExecTimeout {
-  return () => {
-    const model = new Specification.WorkflowExecTimeout(data);
-
-    validate('WorkflowExecTimeout', model);
-    return model;
-  };
-}
-
-/**
- * A factory to create a builder proxy for the type `Specification.WorkflowExecTimeout`
- * @returns {Specification.WorkflowExecTimeout} A builder for `Specification.WorkflowExecTimeout`
- */
-export function workflowExecTimeoutBuilder(): Builder {
-  return builder(workflowExecTimeoutBuildingFn);
-}
diff --git a/src/lib/definitions/action.ts b/src/lib/definitions/action.ts
deleted file mode 100644
index e5b12411..00000000
--- a/src/lib/definitions/action.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { Actiondatafilter } from './actiondatafilter';
-import { Eventref } from './eventref';
-import { Functionref } from './functionref';
-import {
-  normalizeSubFlowRefIfObject,
-  overwriteActionDataFilter,
-  overwriteEventRef,
-  overwriteFunctionRefIfObject,
-  overwriteSleep,
-  overwriteSubFlowRefIfObject,
-} from './utils';
-import { Subflowref } from './subflowref';
-import { Sleep } from './sleep';
-
-export class Action {
-  constructor(model: any) {
-    Object.assign(this, model);
-
-    overwriteFunctionRefIfObject(this);
-    overwriteEventRef(this);
-    overwriteSubFlowRefIfObject(this);
-    overwriteSleep(this);
-    overwriteActionDataFilter(this);
-  }
-
-  /**
-   * Unique action definition name
-   */
-  name?: string;
-  functionRef?: string | Functionref;
-  eventRef?: /* Event References */ Eventref;
-  subFlowRef?: string | Subflowref;
-  sleep?: Sleep;
-  /**
-   * References a defined workflow retry definition. If not defined the default retry policy is assumed
-   */
-  retryRef?: string;
-  /**
-   * List of unique references to defined workflow errors for which the action should not be retried. Used only when `autoRetries` is set to `true`
-   */
-  nonRetryableErrors?: [string, ...string[]];
-  /**
-   * List of unique references to defined workflow errors for which the action should be retried. Used only when `autoRetries` is set to `false`
-   */
-  retryableErrors?: [string, ...string[]];
-  actionDataFilter?: Actiondatafilter;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Action} without deleted properties.
-   */
-  normalize = (): Action => {
-    const clone = new Action(this);
-    normalizeSubFlowRefIfObject(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/actiondatafilter.ts b/src/lib/definitions/actiondatafilter.ts
deleted file mode 100644
index 298c7ae6..00000000
--- a/src/lib/definitions/actiondatafilter.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-export class Actiondatafilter {
-  constructor(model: any) {
-    Object.assign(this, model);
-  }
-
-  /**
-   * Workflow expression that selects state data that the state action can use
-   */
-  fromStateData?: string;
-  /**
-   * Workflow expression that filters the actions data results
-   */
-  results?: string;
-  /**
-   * Workflow expression that selects a state data element to which the action results should be added/merged into. If not specified, denote, the top-level state data element
-   */
-  toStateData?: string;
-}
diff --git a/src/lib/definitions/authdef.ts b/src/lib/definitions/authdef.ts
deleted file mode 100644
index 572756c0..00000000
--- a/src/lib/definitions/authdef.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { normalizeScheme, overwritePropertiesIfObject } from './utils';
-import { Properties } from './types';
-
-export class Authdef {
-  constructor(model: any) {
-    const defaultModel = { scheme: 'basic' };
-    Object.assign(this, defaultModel, model);
-
-    overwritePropertiesIfObject(this);
-  }
-  /**
-   * Unique auth definition name
-   */
-  name: string;
-  /**
-   * Defines the auth type
-   */
-  scheme?: 'basic' | 'bearer' | 'oauth2';
-  properties: string | Properties;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Authdef} without deleted properties.
-   */
-  normalize = (): Authdef => {
-    const clone = new Authdef(this);
-
-    normalizeScheme(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/basicpropsdef.ts b/src/lib/definitions/basicpropsdef.ts
deleted file mode 100644
index ac81e259..00000000
--- a/src/lib/definitions/basicpropsdef.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Metadata } from './metadata';
-import { overwriteMetadata } from './utils';
-export class Basicpropsdef {
-  constructor(model: any) {
-    Object.assign(this, model);
-
-    overwriteMetadata(this);
-  }
-
-  /**
-   * String or a workflow expression. Contains the user name
-   */
-  username: string;
-  /**
-   * String or a workflow expression. Contains the user password
-   */
-  password: string;
-  metadata?: /* Metadata information */ Metadata;
-}
diff --git a/src/lib/definitions/bearerpropsdef.ts b/src/lib/definitions/bearerpropsdef.ts
deleted file mode 100644
index 0a5cc72d..00000000
--- a/src/lib/definitions/bearerpropsdef.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Metadata } from './metadata';
-import { overwriteMetadata } from './utils';
-export class Bearerpropsdef {
-  constructor(model: any) {
-    Object.assign(this, model);
-    overwriteMetadata(this);
-  }
-
-  /**
-   * String or a workflow expression. Contains the token
-   */
-  token: string;
-  metadata?: /* Metadata information */ Metadata;
-}
diff --git a/src/lib/definitions/branch.ts b/src/lib/definitions/branch.ts
deleted file mode 100644
index 5948ea1a..00000000
--- a/src/lib/definitions/branch.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Action } from './action';
-import { normalizeActions, overwriteActions, overwritePropertyAsPlainType } from './utils';
-import { ActionExecTimeout, BranchExecTimeout } from './types';
-
-export class Branch /* Branch Definition */ {
-  constructor(model: any) {
-    Object.assign(this, model);
-    overwriteActions(this);
-    overwritePropertyAsPlainType('timeouts', this);
-  }
-
-  /**
-   * Branch name
-   */
-  name: string;
-  /**
-   * State specific timeouts
-   */
-  timeouts?: {
-    actionExecTimeout?: /* Single actions definition execution timeout duration (ISO 8601 duration format) */ ActionExecTimeout;
-    branchExecTimeout?: /* Single branch execution timeout duration (ISO 8601 duration format) */ BranchExecTimeout;
-  };
-  /**
-   * Actions to be executed in this branch
-   */
-  actions: Action[];
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Action} without deleted properties.
-   */
-  normalize = (): Branch => {
-    const clone = new Branch(this);
-    normalizeActions(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/callbackstate.ts b/src/lib/definitions/callbackstate.ts
deleted file mode 100644
index dadf48fa..00000000
--- a/src/lib/definitions/callbackstate.ts
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Action } from './action';
-import { End } from './end';
-import { Error } from './error';
-import { Eventdatafilter } from './eventdatafilter';
-import { Metadata } from './metadata';
-import { Statedatafilter } from './statedatafilter';
-import { Transition } from './transition';
-import {
-  normalizeAction,
-  normalizeEndIfObject,
-  normalizeOnErrors,
-  normalizeTransitionIfObject,
-  normalizeUsedForCompensation,
-  overwriteAction,
-  overwriteEndIfObject,
-  overwriteEventDataFilter,
-  overwriteMetadata,
-  overwriteOnErrors,
-  overwriteStateDataFilter,
-  overwriteTimeoutWithStateExecTimeout,
-  overwriteTransitionIfObject,
-  setEndValueIfNoTransition,
-} from './utils';
-import { ActionExecTimeout, EventTimeout } from './types';
-import { StateExecTimeout } from './stateExecTimeout';
-
-export class Callbackstate {
-  constructor(model: any) {
-    const defaultModel = { type: 'callback', usedForCompensation: false };
-    Object.assign(this, defaultModel, model);
-
-    overwriteAction(this);
-    overwriteTimeoutWithStateExecTimeout(this);
-    overwriteEventDataFilter(this);
-    overwriteStateDataFilter(this);
-    overwriteOnErrors(this);
-    overwriteTransitionIfObject(this);
-    overwriteEndIfObject(this);
-    overwriteMetadata(this);
-  }
-
-  /**
-   * Unique state id
-   */
-  id?: string;
-  /**
-   * State name
-   */
-  name?: string;
-  /**
-   * State type
-   */
-  type?: 'callback';
-  /**
-   * Defines the action to be executed
-   */
-  action?: Action;
-  /**
-   * References an unique callback event name in the defined workflow events
-   */
-  eventRef?: string;
-  /**
-   * State specific timeouts
-   */
-  timeouts?: {
-    stateExecTimeout?: StateExecTimeout;
-    actionExecTimeout?: /* Single actions definition execution timeout duration (ISO 8601 duration format) */ ActionExecTimeout;
-    eventTimeout?: /* Timeout duration to wait for consuming defined events (ISO 8601 duration format) */ EventTimeout;
-  };
-  /**
-   * Event data filter
-   */
-  eventDataFilter?: Eventdatafilter;
-  /**
-   * State data filter
-   */
-  stateDataFilter?: Statedatafilter;
-  /**
-   * States error handling definitions
-   */
-  onErrors?: Error[];
-  /**
-   * Next transition of the workflow after all the actions have been performed
-   */
-  transition?: string | Transition;
-  /**
-   * State end definition
-   */
-  end?: boolean | End;
-  /**
-   * Unique Name of a workflow state which is responsible for compensation of this state
-   */
-  compensatedBy?: string;
-  /**
-   * If true, this state is used to compensate another state. Default is false
-   */
-  usedForCompensation?: boolean;
-  metadata?: /* Metadata information */ Metadata;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Callbackstate} without deleted properties.
-   */
-  normalize = (): Callbackstate => {
-    const clone = new Callbackstate(this);
-
-    normalizeAction(clone);
-    normalizeOnErrors(clone);
-    normalizeTransitionIfObject(clone);
-    normalizeEndIfObject(clone);
-    normalizeUsedForCompensation(clone);
-    setEndValueIfNoTransition(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/continueasdef.ts b/src/lib/definitions/continueasdef.ts
deleted file mode 100644
index 3dc2e3cd..00000000
--- a/src/lib/definitions/continueasdef.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-import { WorkflowExecTimeout } from './workflowExecTimeout';
-import { normalizeWorkflowExecTimeout, overwritePropertyAsPlainType, overwriteWorkflowExecTimeout } from './utils';
-
-export class Continueasdef {
-  constructor(model: any) {
-    Object.assign(this, model);
-    overwriteWorkflowExecTimeout(this);
-    overwritePropertyAsPlainType('data', this);
-  }
-
-  /**
-   * Unique id of the workflow to continue execution as
-   */
-  workflowId: string;
-  /**
-   * Version of the workflow to continue execution as
-   */
-  version?: string;
-  /**
-   * If string type, an expression which selects parts of the states data output to become the workflow data input of continued execution. If object type, a custom object to become the workflow data input of the continued execution
-   */
-  data?:
-    | string
-    | {
-        [key: string]: any;
-      };
-  /**
-   * Workflow execution timeout to be used by the workflow continuing execution. Overwrites any specific settings set by that workflow
-   */
-  workflowExecTimeout?: WorkflowExecTimeout;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Exectimeout} without deleted properties.
-   */
-  normalize = (): Continueasdef => {
-    const clone = new Continueasdef(this);
-    normalizeWorkflowExecTimeout(clone);
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/crondef.ts b/src/lib/definitions/crondef.ts
deleted file mode 100644
index 6b977739..00000000
--- a/src/lib/definitions/crondef.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-export class Crondef {
-  constructor(model: any) {
-    Object.assign(this, model);
-  }
-
-  /**
-   * Repeating interval (cron expression) describing when the workflow instance should be created
-   */
-  expression: string;
-  /**
-   * Specific date and time (ISO 8601 format) when the cron expression invocation is no longer valid
-   */
-  validUntil?: string;
-}
diff --git a/src/lib/definitions/databasedswitch.ts b/src/lib/definitions/databasedswitch.ts
deleted file mode 100644
index 2356568b..00000000
--- a/src/lib/definitions/databasedswitch.ts
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Defaultconditiondef } from './defaultconditiondef';
-import { Error } from './error';
-import { Metadata } from './metadata';
-import { Statedatafilter } from './statedatafilter';
-import {
-  normalizeDataConditions,
-  normalizeDefaultCondition,
-  normalizeOnErrors,
-  normalizeUsedForCompensation,
-  overwriteDataConditions,
-  overwriteDefaultCondition,
-  overwriteMetadata,
-  overwriteOnErrors,
-  overwriteStateDataFilter,
-  overwriteTimeoutWithStateExecTimeout,
-} from './utils';
-import { Datacondition } from './types';
-import { StateExecTimeout } from './stateExecTimeout';
-
-export class Databasedswitch {
-  constructor(model: any) {
-    const defaultModel = { type: 'switch', usedForCompensation: false };
-    Object.assign(this, defaultModel, model);
-
-    overwriteStateDataFilter(this);
-    overwriteTimeoutWithStateExecTimeout(this);
-    overwriteDataConditions(this);
-    overwriteOnErrors(this);
-    overwriteDefaultCondition(this);
-    overwriteMetadata(this);
-  }
-
-  /**
-   * Unique State id
-   */
-  id?: string;
-  /**
-   * State name
-   */
-  name: string;
-  /**
-   * State type
-   */
-  type: 'switch';
-  /**
-   * State data filter
-   */
-  stateDataFilter?: Statedatafilter;
-  /**
-   * State specific timeouts
-   */
-  timeouts?: {
-    stateExecTimeout?: StateExecTimeout;
-  };
-  /**
-   * Defines conditions evaluated against state data
-   */
-  dataConditions: Datacondition[];
-  /**
-   * States error handling definitions
-   */
-  onErrors?: Error[];
-  /**
-   * Default transition of the workflow if there is no matching data conditions. Can include a transition or end definition
-   */
-  defaultCondition?: /* DefaultCondition definition. Can be either a transition or end definition */ Defaultconditiondef;
-  /**
-   * Unique Name of a workflow state which is responsible for compensation of this state
-   */
-  compensatedBy?: string;
-  /**
-   * If true, this state is used to compensate another state. Default is false
-   */
-  usedForCompensation?: boolean;
-  metadata?: /* Metadata information */ Metadata;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Databasedswitch} without deleted properties.
-   */
-  normalize = (): Databasedswitch => {
-    const clone = new Databasedswitch(this);
-
-    normalizeDataConditions(clone);
-    normalizeOnErrors(clone);
-    normalizeDefaultCondition(clone);
-    normalizeUsedForCompensation(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/defaultconditiondef.ts b/src/lib/definitions/defaultconditiondef.ts
deleted file mode 100644
index dafac30a..00000000
--- a/src/lib/definitions/defaultconditiondef.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { End } from './end';
-import { Transition } from './transition';
-import {
-  normalizeEndIfObject,
-  normalizeTransitionIfObject,
-  overwriteEndIfObject,
-  overwriteTransitionIfObject,
-  setEndValueIfNoTransition,
-} from './utils';
-export class Defaultconditiondef /* DefaultCondition definition. Can be either a transition or end definition */ {
-  constructor(model: any) {
-    Object.assign(this, model);
-
-    overwriteTransitionIfObject(this);
-    overwriteEndIfObject(this);
-  }
-
-  transition: string | Transition;
-  end?: boolean | End;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Defaultdef} without deleted properties.
-   */
-  normalize = (): Defaultconditiondef => {
-    const clone = new Defaultconditiondef(this);
-
-    normalizeEndIfObject(clone);
-    normalizeTransitionIfObject(clone);
-    setEndValueIfNoTransition(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/end.ts b/src/lib/definitions/end.ts
deleted file mode 100644
index 0688a5be..00000000
--- a/src/lib/definitions/end.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { Produceeventdef } from './produceeventdef';
-import {
-  normalizeCompensate,
-  normalizeContinueAsIfObject,
-  normalizeTerminate,
-  overwriteContinueAsIfObject,
-  overwriteProduceEvents,
-} from './utils';
-import { Continueasdef } from './continueasdef';
-
-export class End {
-  constructor(model: any) {
-    const defaultModel = {
-      compensate: false,
-      terminate: false,
-    };
-    Object.assign(this, defaultModel, model);
-
-    overwriteProduceEvents(this);
-    overwriteContinueAsIfObject(this);
-  }
-
-  /**
-   * If true, completes all execution flows in the given workflow instance
-   */
-  terminate?: boolean;
-  /**
-   * Defines events that should be produced
-   */
-  produceEvents?: /* Produce an event and set its data */ Produceeventdef[];
-  /**
-   * If set to true, triggers workflow compensation. Default is false
-   */
-  compensate?: boolean;
-  continueAs?: string | Continueasdef;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.End} without deleted properties.
-   */
-  normalize = (): End => {
-    const clone = new End(this);
-
-    normalizeCompensate(clone);
-    normalizeTerminate(clone);
-    normalizeContinueAsIfObject(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/enddatacondition.ts b/src/lib/definitions/enddatacondition.ts
deleted file mode 100644
index 3cadfdb8..00000000
--- a/src/lib/definitions/enddatacondition.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { End } from './end';
-import { Metadata } from './metadata';
-import { normalizeEndIfObject, overwriteEndIfObject, overwriteMetadata } from './utils';
-
-export class Enddatacondition {
-  constructor(model: any) {
-    Object.assign(this, model);
-
-    overwriteEndIfObject(this);
-    overwriteMetadata(this);
-  }
-
-  /**
-   * Data condition name
-   */
-  name?: string;
-  /**
-   * Workflow expression evaluated against state data. Must evaluate to true or false
-   */
-  condition: string;
-  /**
-   * Workflow end definition
-   */
-  end: boolean | End;
-  metadata?: /* Metadata information */ Metadata;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Enddatacondition} without deleted properties.
-   */
-  normalize = (): Enddatacondition => {
-    const clone = new Enddatacondition(this);
-
-    normalizeEndIfObject(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/enddeventcondition.ts b/src/lib/definitions/enddeventcondition.ts
deleted file mode 100644
index 65858cd7..00000000
--- a/src/lib/definitions/enddeventcondition.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { End } from './end';
-import { Eventdatafilter } from './eventdatafilter';
-import { Metadata } from './metadata';
-import { normalizeEndIfObject, overwriteEndIfObject, overwriteEventDataFilter, overwriteMetadata } from './utils';
-
-export class Enddeventcondition {
-  constructor(model: any) {
-    Object.assign(this, model);
-
-    overwriteEndIfObject(this);
-    overwriteEventDataFilter(this);
-    overwriteMetadata(this);
-  }
-
-  /**
-   * Event condition name
-   */
-  name?: string;
-  /**
-   * References an unique event name in the defined workflow events
-   */
-  eventRef: string;
-  /**
-   * Explicit transition to end
-   */
-  end: boolean | End;
-  /**
-   * Event data filter definition
-   */
-  eventDataFilter?: Eventdatafilter;
-  metadata?: /* Metadata information */ Metadata;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Enddeventcondition} without deleted properties.
-   */
-  normalize = (): Enddeventcondition => {
-    const clone = new Enddeventcondition(this);
-
-    normalizeEndIfObject(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/error.ts b/src/lib/definitions/error.ts
deleted file mode 100644
index cf390192..00000000
--- a/src/lib/definitions/error.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { End } from './end';
-import { Transition } from './transition';
-import {
-  normalizeEndIfObject,
-  normalizeTransitionIfObject,
-  overwriteEndIfObject,
-  overwriteTransitionIfObject,
-  setEndValueIfNoTransition,
-} from './utils';
-
-export class Error {
-  constructor(model: any) {
-    Object.assign(this, model);
-
-    overwriteTransitionIfObject(this);
-    overwriteEndIfObject(this);
-  }
-
-  /**
-   * Reference to a unique workflow error definition. Used of errorRefs is not used
-   */
-  errorRef: string;
-  /**
-   * References one or more workflow error definitions. Used if errorRef is not used
-   */
-  errorRefs?: [string, ...string[]];
-  transition: string | Transition;
-  end?: boolean | End;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Error} without deleted properties.
-   */
-  normalize = (): Error => {
-    const clone = new Error(this);
-
-    normalizeEndIfObject(clone);
-    normalizeTransitionIfObject(clone);
-
-    setEndValueIfNoTransition(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/errordef.ts b/src/lib/definitions/errordef.ts
deleted file mode 100644
index 5c6d6ea1..00000000
--- a/src/lib/definitions/errordef.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-export class Errordef {
-  constructor(model: any) {
-    Object.assign(this, model);
-  }
-
-  /**
-   * Domain-specific error name
-   */
-  name: string;
-  /**
-   * Error code. Can be used in addition to the name to help runtimes resolve to technical errors/exceptions. Should not be defined if error is set to '*'
-   */
-  code?: string;
-  /**
-   * Error description
-   */
-  description?: string;
-}
diff --git a/src/lib/definitions/eventbasedswitch.ts b/src/lib/definitions/eventbasedswitch.ts
deleted file mode 100644
index 616375b6..00000000
--- a/src/lib/definitions/eventbasedswitch.ts
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Defaultconditiondef } from './defaultconditiondef';
-import { Error } from './error';
-import { Metadata } from './metadata';
-import { Statedatafilter } from './statedatafilter';
-import {
-  normalizeDefaultCondition,
-  normalizeEventConditions,
-  normalizeOnErrors,
-  normalizeUsedForCompensation,
-  overwriteDefaultCondition,
-  overwriteEventConditions,
-  overwriteMetadata,
-  overwriteOnErrors,
-  overwriteStateDataFilter,
-  overwriteTimeoutWithStateExecTimeout,
-} from './utils';
-import { Eventcondition, EventTimeout } from './types';
-import { StateExecTimeout } from './stateExecTimeout';
-
-export class Eventbasedswitch {
-  constructor(model: any) {
-    const defaultModel = {
-      type: 'switch',
-      usedForCompensation: false,
-    };
-    Object.assign(this, defaultModel, model);
-
-    overwriteStateDataFilter(this);
-    overwriteTimeoutWithStateExecTimeout(this);
-    overwriteEventConditions(this);
-    overwriteOnErrors(this);
-    overwriteDefaultCondition(this);
-    overwriteMetadata(this);
-  }
-
-  /**
-   * Unique State id
-   */
-  id?: string;
-  /**
-   * State name
-   */
-  name: string;
-  /**
-   * State type
-   */
-  type: 'switch';
-  /**
-   * State data filter
-   */
-  stateDataFilter?: Statedatafilter;
-  /**
-   * State specific timeouts
-   */
-  timeouts?: {
-    stateExecTimeout?: StateExecTimeout;
-    eventTimeout?: /* Timeout duration to wait for consuming defined events (ISO 8601 duration format) */ EventTimeout;
-  };
-  /**
-   * Defines conditions evaluated against events
-   */
-  eventConditions: Eventcondition[];
-  /**
-   * States error handling definitions
-   */
-  onErrors?: Error[];
-  /**
-   * Default transition of the workflow if there is no matching data conditions. Can include a transition or end definition
-   */
-  defaultCondition?: /* DefaultCondition definition. Can be either a transition or end definition */ Defaultconditiondef;
-  /**
-   * Unique Name of a workflow state which is responsible for compensation of this state
-   */
-  compensatedBy?: string;
-  /**
-   * If true, this state is used to compensate another state. Default is false
-   */
-  usedForCompensation?: boolean;
-  metadata?: /* Metadata information */ Metadata;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Eventbasedswitch} without deleted properties.
-   */
-  normalize = (): Eventbasedswitch => {
-    const clone = new Eventbasedswitch(this);
-
-    normalizeEventConditions(clone);
-    normalizeOnErrors(clone);
-    normalizeDefaultCondition(clone);
-    normalizeUsedForCompensation(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/eventdatafilter.ts b/src/lib/definitions/eventdatafilter.ts
deleted file mode 100644
index 0c346367..00000000
--- a/src/lib/definitions/eventdatafilter.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-export class Eventdatafilter {
-  constructor(model: any) {
-    Object.assign(this, model);
-  }
-
-  /**
-   * Workflow expression that filters the received event/payload (default: '${ . }')
-   */
-  data?: string;
-  /**
-   *  Workflow expression that selects a state data element to which the filtered event should be added/merged into. If not specified, denotes, the top-level state data element.
-   */
-  toStateData?: string;
-}
diff --git a/src/lib/definitions/eventdef.ts b/src/lib/definitions/eventdef.ts
deleted file mode 100644
index c5aade0b..00000000
--- a/src/lib/definitions/eventdef.ts
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { Metadata } from './metadata';
-import { normalizeDataOnly, normalizeKind, overwriteCorrelation, overwriteMetadata } from './utils';
-import { CorrelationDefs } from './types';
-
-export class Eventdef {
-  constructor(model: any) {
-    const defaultModel = {
-      kind: 'consumed',
-      dataOnly: true,
-    };
-    Object.assign(this, defaultModel, model);
-
-    overwriteCorrelation(this);
-    overwriteMetadata(this);
-  }
-
-  /**
-   * Unique event name
-   */
-  name?: string;
-  /**
-   * CloudEvent source
-   */
-  source?: string;
-  /**
-   * CloudEvent type
-   */
-  type?: string;
-  /**
-   * Defines the CloudEvent as either 'consumed' or 'produced' by the workflow. Default is 'consumed'
-   */
-  kind?: 'consumed' | 'produced';
-  /**
-   * CloudEvent correlation definitions
-   */
-  correlation?: CorrelationDefs;
-
-  /**
-   * If `true`, only the Event payload is accessible to consuming Workflow states. If `false`, both event payload and context attributes should be accessible
-   */
-  dataOnly?: boolean;
-  /**
-   * Metadata information
-   */
-  metadata?: /* Metadata information */ Metadata;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Eventdef} without deleted properties.
-   */
-  normalize = (): Eventdef => {
-    const clone = new Eventdef(this);
-
-    normalizeKind(clone);
-    normalizeDataOnly(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/eventref.ts b/src/lib/definitions/eventref.ts
deleted file mode 100644
index 2d7133d9..00000000
--- a/src/lib/definitions/eventref.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { overwritePropertyAsPlainType } from './utils';
-
-export class Eventref {
-  constructor(model: any) {
-    Object.assign(this, model);
-    overwritePropertyAsPlainType('data', this);
-    overwritePropertyAsPlainType('contextAttributes', this);
-  }
-
-  /**
-   * Reference to the unique name of a 'produced' event definition
-   */
-  triggerEventRef: string;
-  /**
-   * Reference to the unique name of a 'consumed' event definition
-   */
-  resultEventRef: string;
-  /**
-   * If string type, an expression which selects parts of the states data output to become the data (payload) of the event referenced by 'triggerEventRef'. If object type, a custom object to become the data (payload) of the event referenced by 'triggerEventRef'.
-   */
-  data?:
-    | string
-    | {
-        [key: string]: any;
-      };
-  /**
-   * Add additional extension context attributes to the produced event
-   */
-  contextAttributes?: {
-    [name: string]: string;
-  };
-}
diff --git a/src/lib/definitions/eventstate.ts b/src/lib/definitions/eventstate.ts
deleted file mode 100644
index c157e8dd..00000000
--- a/src/lib/definitions/eventstate.ts
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { End } from './end';
-import { Error } from './error';
-import { Metadata } from './metadata';
-import { Onevents } from './onevents';
-import { Statedatafilter } from './statedatafilter';
-import { Transition } from './transition';
-import {
-  normalizeEndIfObject,
-  normalizeExclusive,
-  normalizeOnErrors,
-  normalizeOnEvents,
-  normalizeTransitionIfObject,
-  overwriteEndIfObject,
-  overwriteMetadata,
-  overwriteOnErrors,
-  overwriteOnEvents,
-  overwriteStateDataFilter,
-  overwriteTransitionIfObject,
-  setEndValueIfNoTransition,
-  overwriteTimeoutWithStateExecTimeout,
-} from './utils';
-import { ActionExecTimeout, EventTimeout } from './types';
-import { StateExecTimeout } from './stateExecTimeout';
-
-export class Eventstate /* This state is used to wait for events from event sources, then consumes them and invoke one or more actions to run in sequence or parallel */ {
-  constructor(model: any) {
-    const defaultModel = { type: 'event', exclusive: true };
-    Object.assign(this, defaultModel, model);
-
-    overwriteOnEvents(this);
-    overwriteTimeoutWithStateExecTimeout(this);
-    overwriteStateDataFilter(this);
-    overwriteOnErrors(this);
-    overwriteTransitionIfObject(this);
-    overwriteEndIfObject(this);
-    overwriteMetadata(this);
-  }
-
-  /**
-   * Unique State id
-   */
-  id?: string;
-  /**
-   * State name
-   */
-  name: string;
-  /**
-   * State type
-   */
-  type: 'event';
-  /**
-   * If true consuming one of the defined events causes its associated actions to be performed. If false all of the defined events must be consumed in order for actions to be performed
-   */
-  exclusive?: boolean;
-  /**
-   * Define the events to be consumed and optional actions to be performed
-   */
-  onEvents: Onevents[];
-  /**
-   * State specific timeouts
-   */
-  timeouts?: {
-    stateExecTimeout?: StateExecTimeout;
-    actionExecTimeout?: /* Single actions definition execution timeout duration (ISO 8601 duration format) */ ActionExecTimeout;
-    eventTimeout?: /* Timeout duration to wait for consuming defined events (ISO 8601 duration format) */ EventTimeout;
-  };
-  stateDataFilter?: Statedatafilter;
-  /**
-   * States error handling definitions
-   */
-  onErrors?: Error[];
-  transition?: string | Transition;
-  end: boolean | End;
-  /**
-   * Unique Name of a workflow state which is responsible for compensation of this state
-   */
-  compensatedBy?: string;
-  metadata?: /* Metadata information */ Metadata;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Eventstate} without deleted properties.
-   */
-  normalize = (): Eventstate => {
-    const clone = new Eventstate(this);
-
-    normalizeExclusive(clone);
-    normalizeOnEvents(clone);
-    normalizeOnErrors(clone);
-    normalizeTransitionIfObject(clone);
-    normalizeEndIfObject(clone);
-    setEndValueIfNoTransition(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/foreachstate.ts b/src/lib/definitions/foreachstate.ts
deleted file mode 100644
index ca2fcac1..00000000
--- a/src/lib/definitions/foreachstate.ts
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { Action } from './action';
-import { End } from './end';
-import { Error } from './error';
-import { Metadata } from './metadata';
-import { Statedatafilter } from './statedatafilter';
-import { Transition } from './transition';
-import {
-  normalizeActions,
-  normalizeEndIfObject,
-  normalizeOnErrors,
-  normalizeTransitionIfObject,
-  normalizeUsedForCompensation,
-  overwriteActions,
-  overwriteEndIfObject,
-  overwriteMetadata,
-  overwriteOnErrors,
-  overwriteStateDataFilter,
-  overwriteTransitionIfObject,
-  setEndValueIfNoTransition,
-  normalizeMode,
-  overwriteTimeoutWithStateExecTimeout,
-} from './utils';
-import { ActionExecTimeout } from './types';
-import { StateExecTimeout } from './stateExecTimeout';
-
-export class Foreachstate {
-  constructor(model: any) {
-    const defaultModel = { type: 'foreach', usedForCompensation: false, mode: 'parallel' };
-    Object.assign(this, defaultModel, model);
-
-    overwriteEndIfObject(this);
-    overwriteActions(this);
-    overwriteTimeoutWithStateExecTimeout(this);
-    overwriteStateDataFilter(this);
-    overwriteOnErrors(this);
-    overwriteTransitionIfObject(this);
-    overwriteMetadata(this);
-  }
-
-  /**
-   * Unique State id
-   */
-  id?: string;
-  /**
-   * State name
-   */
-  name?: string;
-  /**
-   * State type
-   */
-  type?: 'foreach';
-  /**
-   * State end definition
-   */
-  end?: boolean | End;
-  /**
-   * Workflow expression selecting an array element of the states data
-   */
-  inputCollection?: string;
-  /**
-   * Workflow expression specifying an array element of the states data to add the results of each iteration
-   */
-  outputCollection?: string;
-  /**
-   * Name of the iteration parameter that can be referenced in actions/workflow. For each parallel iteration, this param should contain an unique element of the inputCollection array
-   */
-  iterationParam?: string;
-  /**
-   * Specifies how many iterations may run in parallel at the same time. Used if 'mode' property is set to 'parallel' (default)
-   */
-  batchSize?: number | string;
-  /**
-   * Actions to be executed for each of the elements of inputCollection
-   */
-  actions?: Action[];
-  /**
-   * State specific timeouts
-   */
-  timeouts?: {
-    stateExecTimeout?: StateExecTimeout;
-    actionExecTimeout?: /* Single actions definition execution timeout duration (ISO 8601 duration format) */ ActionExecTimeout;
-  };
-  /**
-   * State data filter
-   */
-  stateDataFilter?: Statedatafilter;
-  /**
-   * States error handling definitions
-   */
-  onErrors?: Error[];
-  /**
-   * Next transition of the workflow after state has completed
-   */
-  transition?: string | Transition;
-  /**
-   * Unique Name of a workflow state which is responsible for compensation of this state
-   */
-  compensatedBy?: string;
-  /**
-   * If true, this state is used to compensate another state. Default is false
-   */
-  usedForCompensation?: boolean;
-
-  /**
-   * Specifies how iterations are to be performed (sequentially or in parallel)
-   */
-  mode?: 'sequential' | 'parallel';
-  metadata?: /* Metadata information */ Metadata;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Foreachstate} without deleted properties.
-   */
-  normalize = (): Foreachstate => {
-    const clone = new Foreachstate(this);
-
-    normalizeEndIfObject(clone);
-    normalizeActions(clone);
-    normalizeOnErrors(clone);
-    normalizeTransitionIfObject(clone);
-    normalizeUsedForCompensation(clone);
-    normalizeMode(clone);
-    setEndValueIfNoTransition(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/function.ts b/src/lib/definitions/function.ts
deleted file mode 100644
index 1693c566..00000000
--- a/src/lib/definitions/function.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { normalizeType, overwriteMetadata } from './utils';
-
-import { Metadata } from './metadata';
-export class Function {
-  constructor(model: any) {
-    const defaultModel = { type: 'rest' };
-    Object.assign(this, defaultModel, model);
-    overwriteMetadata(this);
-  }
-
-  /**
-   * Unique function name
-   */
-  name: string;
-  /**
-   * If type is `rest`, #. If type is `asyncapi`, #. If type is `rpc`, ##. If type is `graphql`, ##. If type is `odata`, #. If type is `expression`, defines the workflow expression.
-   */
-  operation: string;
-  /**
-   * Defines the function type. Is either `rest`, `asyncapi, `rpc`, `graphql`, `odata`, or `expression`. Default is `rest`
-   */
-  type?: 'rest' | 'asyncapi' | 'rpc' | 'graphql' | 'odata' | 'expression';
-  /**
-   * References an auth definition name to be used to access to resource defined in the operation parameter
-   */
-  authRef?: string;
-  metadata?: /* Metadata information */ Metadata;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Function} without deleted properties.
-   */
-
-  normalize = (): Function => {
-    const clone = new Function(this);
-
-    normalizeType(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/injectstate.ts b/src/lib/definitions/injectstate.ts
deleted file mode 100644
index c1b65f2d..00000000
--- a/src/lib/definitions/injectstate.ts
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { End } from './end';
-import { Metadata } from './metadata';
-import { Statedatafilter } from './statedatafilter';
-import { Transition } from './transition';
-import {
-  normalizeEndIfObject,
-  normalizeTransitionIfObject,
-  normalizeUsedForCompensation,
-  overwriteEndIfObject,
-  overwriteMetadata,
-  overwritePropertyAsPlainType,
-  overwriteStateDataFilter,
-  overwriteTimeoutWithStateExecTimeout,
-  overwriteTransitionIfObject,
-  setEndValueIfNoTransition,
-} from './utils';
-import { StateExecTimeout } from './stateExecTimeout';
-
-export class Injectstate {
-  constructor(model: any) {
-    const defaultModel = { type: 'inject', usedForCompensation: false };
-    Object.assign(this, defaultModel, model);
-
-    overwriteEndIfObject(this);
-    overwritePropertyAsPlainType('data', this);
-    overwriteTimeoutWithStateExecTimeout(this);
-    overwriteStateDataFilter(this);
-    overwriteTransitionIfObject(this);
-    overwriteMetadata(this);
-  }
-
-  /**
-   * Unique state id
-   */
-  id?: string;
-  /**
-   * State name
-   */
-  name?: string;
-  /**
-   * State type
-   */
-  type?: 'inject';
-  /**
-   * State end definition
-   */
-  end?: boolean | End;
-  /**
-   * JSON object which can be set as states data input and can be manipulated via filters
-   */
-  data?: {
-    [key: string]: any;
-  };
-  /**
-   * State specific timeouts
-   */
-  timeouts?: {
-    stateExecTimeout?: StateExecTimeout;
-  };
-  /**
-   * State data filter
-   */
-  stateDataFilter?: Statedatafilter;
-  /**
-   * Next transition of the workflow after injection has completed
-   */
-  transition?: string | Transition;
-  /**
-   * Unique Name of a workflow state which is responsible for compensation of this state
-   */
-  compensatedBy?: string;
-  /**
-   * If true, this state is used to compensate another state. Default is false
-   */
-  usedForCompensation?: boolean;
-  metadata?: /* Metadata information */ Metadata;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Injectstate} without deleted properties.
-   */
-  normalize = (): Injectstate => {
-    const clone = new Injectstate(this);
-
-    normalizeEndIfObject(clone);
-    normalizeTransitionIfObject(clone);
-    normalizeUsedForCompensation(clone);
-    setEndValueIfNoTransition(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/oauth2propsdef.ts b/src/lib/definitions/oauth2propsdef.ts
deleted file mode 100644
index f425596f..00000000
--- a/src/lib/definitions/oauth2propsdef.ts
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Metadata } from './metadata';
-import { overwriteMetadata } from './utils';
-export class Oauth2propsdef {
-  constructor(model: any) {
-    Object.assign(this, model);
-    overwriteMetadata(this);
-  }
-
-  /**
-   * String or a workflow expression. Contains the authority information
-   */
-  authority?: string;
-  /**
-   * Defines the grant type
-   */
-  grantType: 'password' | 'clientCredentials' | 'tokenExchange';
-  /**
-   * String or a workflow expression. Contains the client identifier
-   */
-  clientId: string;
-  /**
-   * Workflow secret or a workflow expression. Contains the client secret
-   */
-  clientSecret?: string;
-  /**
-   * Array containing strings or workflow expressions. Contains the OAuth2 scopes
-   */
-  scopes?: [string, ...string[]];
-  /**
-   * String or a workflow expression. Contains the user name. Used only if grantType is 'resourceOwner'
-   */
-  username?: string;
-  /**
-   * String or a workflow expression. Contains the user password. Used only if grantType is 'resourceOwner'
-   */
-  password?: string;
-  /**
-   * Array containing strings or workflow expressions. Contains the OAuth2 audiences
-   */
-  audiences?: [string, ...string[]];
-  /**
-   * String or a workflow expression. Contains the subject token
-   */
-  subjectToken?: string;
-  /**
-   * String or a workflow expression. Contains the requested subject
-   */
-  requestedSubject?: string;
-  /**
-   * String or a workflow expression. Contains the requested issuer
-   */
-  requestedIssuer?: string;
-  metadata?: /* Metadata information */ Metadata;
-}
diff --git a/src/lib/definitions/onevents.ts b/src/lib/definitions/onevents.ts
deleted file mode 100644
index 737c3700..00000000
--- a/src/lib/definitions/onevents.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { Action } from './action';
-import { Eventdatafilter } from './eventdatafilter';
-import { normalizeActionMode, normalizeActions, overwriteActions, overwriteEventDataFilter } from './utils';
-
-export class Onevents {
-  constructor(model: any) {
-    const defaultModel = { actionMode: 'sequential' };
-    Object.assign(this, defaultModel, model);
-
-    overwriteActions(this);
-    overwriteEventDataFilter(this);
-  }
-
-  /**
-   * References one or more unique event names in the defined workflow events
-   */
-  eventRefs: [string, ...string[]];
-  /**
-   * Specifies how actions are to be performed (in sequence or in parallel)
-   */
-  actionMode?: 'sequential' | 'parallel';
-  /**
-   * Actions to be performed if expression matches
-   */
-  actions?: Action[];
-  /**
-   * Event data filter
-   */
-  eventDataFilter?: Eventdatafilter;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Onevents} without deleted properties.
-   */
-  normalize = (): Onevents => {
-    const clone = new Onevents(this);
-
-    normalizeActionMode(clone);
-    normalizeActions(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/operationstate.ts b/src/lib/definitions/operationstate.ts
deleted file mode 100644
index de0c9a58..00000000
--- a/src/lib/definitions/operationstate.ts
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { Action } from './action';
-import { End } from './end';
-import { Error } from './error';
-import { Metadata } from './metadata';
-import { Statedatafilter } from './statedatafilter';
-import { Transition } from './transition';
-import {
-  normalizeActionMode,
-  normalizeActions,
-  normalizeEndIfObject,
-  normalizeOnErrors,
-  normalizeTransitionIfObject,
-  normalizeUsedForCompensation,
-  overwriteActions,
-  overwriteEndIfObject,
-  overwriteMetadata,
-  overwriteOnErrors,
-  overwriteStateDataFilter,
-  overwriteTransitionIfObject,
-  setEndValueIfNoTransition,
-  overwriteTimeoutWithStateExecTimeout,
-} from './utils';
-import { ActionExecTimeout } from './types';
-import { StateExecTimeout } from './stateExecTimeout';
-
-export class Operationstate {
-  constructor(model: any) {
-    const defaultModel = {
-      type: 'operation',
-      actionMode: 'sequential',
-      usedForCompensation: false,
-    };
-    Object.assign(this, defaultModel, model);
-
-    overwriteEndIfObject(this);
-    overwriteStateDataFilter(this);
-    overwriteActions(this);
-    overwriteTimeoutWithStateExecTimeout(this);
-    overwriteOnErrors(this);
-    overwriteTransitionIfObject(this);
-    overwriteMetadata(this);
-  }
-
-  /**
-   * Unique State id
-   */
-  id?: string;
-  /**
-   * State name
-   */
-  name?: string;
-  /**
-   * State type
-   */
-  type?: 'operation';
-  /**
-   * State end definition
-   */
-  end?: boolean | End;
-  /**
-   * State data filter
-   */
-  stateDataFilter?: Statedatafilter;
-  /**
-   * Specifies whether actions are performed in sequence or in parallel
-   */
-  actionMode?: 'sequential' | 'parallel';
-  /**
-   * Actions to be performed
-   */
-  actions?: Action[];
-  /**
-   * State specific timeouts
-   */
-  timeouts?: {
-    stateExecTimeout?: StateExecTimeout;
-    actionExecTimeout?: /* Single actions definition execution timeout duration (ISO 8601 duration format) */ ActionExecTimeout;
-  };
-  /**
-   * States error handling definitions
-   */
-  onErrors?: Error[];
-  /**
-   * Next transition of the workflow after all the actions have been performed
-   */
-  transition?: string | Transition;
-  /**
-   * Unique Name of a workflow state which is responsible for compensation of this state
-   */
-  compensatedBy?: string;
-  /**
-   * If true, this state is used to compensate another state. Default is false
-   */
-  usedForCompensation?: boolean;
-  metadata?: /* Metadata information */ Metadata;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Operationstate} without deleted properties.
-   */
-  normalize = (): Operationstate => {
-    const clone = new Operationstate(this);
-
-    normalizeEndIfObject(clone);
-    normalizeActionMode(clone);
-    normalizeActions(clone);
-    normalizeOnErrors(clone);
-    normalizeTransitionIfObject(clone);
-    normalizeUsedForCompensation(clone);
-    setEndValueIfNoTransition(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/parallelstate.ts b/src/lib/definitions/parallelstate.ts
deleted file mode 100644
index 6d1baeef..00000000
--- a/src/lib/definitions/parallelstate.ts
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Branch } from './branch';
-import { End } from './end';
-import { Error } from './error';
-import { Metadata } from './metadata';
-import { Statedatafilter } from './statedatafilter';
-import { Transition } from './transition';
-import {
-  normalizeBranches,
-  normalizeCompletionType,
-  normalizeEndIfObject,
-  normalizeOnErrors,
-  normalizeTransitionIfObject,
-  normalizeUsedForCompensation,
-  overwriteBranches,
-  overwriteEndIfObject,
-  overwriteMetadata,
-  overwriteOnErrors,
-  overwriteStateDataFilter,
-  overwriteTransitionIfObject,
-  setEndValueIfNoTransition,
-  overwriteTimeoutWithStateExecTimeout,
-} from './utils';
-import { BranchExecTimeout } from './types';
-import { StateExecTimeout } from './stateExecTimeout';
-
-export class Parallelstate {
-  constructor(model: any) {
-    const defaultModel = {
-      type: 'parallel',
-      completionType: 'allOf',
-      usedForCompensation: false,
-    };
-    Object.assign(this, defaultModel, model);
-
-    overwriteEndIfObject(this);
-    overwriteStateDataFilter(this);
-    overwriteTimeoutWithStateExecTimeout(this);
-    overwriteBranches(this);
-    overwriteOnErrors(this);
-    overwriteTransitionIfObject(this);
-    overwriteMetadata(this);
-  }
-
-  /**
-   * Unique State id
-   */
-  id?: string;
-  /**
-   * State name
-   */
-  name?: string;
-  /**
-   * State type
-   */
-  type?: 'parallel';
-  /**
-   * State end definition
-   */
-  end?: boolean | End;
-  /**
-   * State data filter
-   */
-  stateDataFilter?: Statedatafilter;
-  /**
-   * State specific timeouts
-   */
-  timeouts?: {
-    stateExecTimeout?: StateExecTimeout;
-    branchExecTimeout?: /* Single branch execution timeout duration (ISO 8601 duration format) */ BranchExecTimeout;
-  };
-  /**
-   * Branch Definitions
-   */
-  branches?: /* Branch Definition */ Branch[];
-  /**
-   * Option types on how to complete branch execution.
-   */
-  completionType?: 'allOf' | 'atLeast';
-  /**
-   * Used when completionType is set to 'atLeast' to specify the minimum number of branches that must complete before the state will transition.
-   */
-  numCompleted?: number | string;
-  /**
-   * States error handling definitions
-   */
-  onErrors?: Error[];
-  /**
-   * Next transition of the workflow after all branches have completed execution
-   */
-  transition?: string | Transition;
-  /**
-   * Unique Name of a workflow state which is responsible for compensation of this state
-   */
-  compensatedBy?: string;
-  /**
-   * If true, this state is used to compensate another state. Default is false
-   */
-  usedForCompensation?: boolean;
-  metadata?: /* Metadata information */ Metadata;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Parallelstate} without deleted properties.
-   */
-  normalize = (): Parallelstate => {
-    const clone = new Parallelstate(this);
-
-    normalizeEndIfObject(clone);
-    normalizeBranches(clone);
-    normalizeCompletionType(clone);
-    normalizeOnErrors(clone);
-    normalizeTransitionIfObject(clone);
-    normalizeUsedForCompensation(clone);
-    setEndValueIfNoTransition(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/produceeventdef.ts b/src/lib/definitions/produceeventdef.ts
deleted file mode 100644
index ff7db272..00000000
--- a/src/lib/definitions/produceeventdef.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { overwritePropertyAsPlainType } from './utils';
-
-export class Produceeventdef {
-  constructor(model: any) {
-    Object.assign(this, model);
-    overwritePropertyAsPlainType('data', this);
-    overwritePropertyAsPlainType('contextAttributes', this);
-  }
-
-  /**
-   * References a name of a defined event
-   */
-  eventRef: string;
-  /**
-   * If String, expression which selects parts of the states data output to become the data of the produced event. If object a custom object to become the data of produced event.
-   */
-  data?:
-    | string
-    | {
-        [key: string]: any;
-      };
-  /**
-   * Add additional event extension context attributes
-   */
-  contextAttributes?: {
-    [name: string]: string;
-  };
-}
diff --git a/src/lib/definitions/retrydef.ts b/src/lib/definitions/retrydef.ts
deleted file mode 100644
index 877a9837..00000000
--- a/src/lib/definitions/retrydef.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-export class Retrydef {
-  constructor(model: any) {
-    Object.assign(this, model);
-  }
-
-  /**
-   * Unique retry strategy name
-   */
-  name: string;
-  /**
-   * Time delay between retry attempts (ISO 8601 duration format)
-   */
-  delay?: string;
-  /**
-   * Maximum time delay between retry attempts (ISO 8601 duration format)
-   */
-  maxDelay?: string;
-  /**
-   * Static value by which the delay increases during each attempt (ISO 8601 time format)
-   */
-  increment?: string;
-  /**
-   * Numeric value, if specified the delay between retries is multiplied by this value.
-   */
-  multiplier?: number | string;
-  /**
-   * Maximum number of retry attempts.
-   */
-  maxAttempts: number | string;
-  /**
-   * If float type, maximum amount of random time added or subtracted from the delay between each retry relative to total delay (between 0 and 1). If string type, absolute maximum amount of random time added or subtracted from the delay between each retry (ISO 8601 duration format)
-   */
-  jitter?: number | string;
-}
diff --git a/src/lib/definitions/schedule.ts b/src/lib/definitions/schedule.ts
deleted file mode 100644
index 38f07dfc..00000000
--- a/src/lib/definitions/schedule.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { Crondef } from './crondef';
-import { overwriteCronIfObject } from './utils';
-
-export class Schedule {
-  constructor(model: any) {
-    Object.assign(this, model);
-
-    overwriteCronIfObject(this);
-  }
-
-  /**
-   * Time interval (must be repeating interval) described with ISO 8601 format. Declares when workflow instances will be automatically created.
-   */
-  interval?: string;
-  cron?: string | Crondef;
-  /**
-   * Timezone name used to evaluate the interval & cron-expression. (default: UTC)
-   */
-  timezone?: string;
-}
diff --git a/src/lib/definitions/sleep.ts b/src/lib/definitions/sleep.ts
deleted file mode 100644
index 0ce1b6f0..00000000
--- a/src/lib/definitions/sleep.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-export class Sleep {
-  constructor(model: any) {
-    Object.assign(this, model);
-  }
-
-  /**
-   * Amount of time (ISO 8601 duration format) to sleep before function/subflow invocation. Does not apply if 'eventRef' is defined.
-   */
-  before: string;
-  /**
-   * Amount of time (ISO 8601 duration format) to sleep after function/subflow invocation. Does not apply if 'eventRef' is defined.
-   */
-  after?: string;
-}
diff --git a/src/lib/definitions/sleepstate.ts b/src/lib/definitions/sleepstate.ts
deleted file mode 100644
index ce2b2f28..00000000
--- a/src/lib/definitions/sleepstate.ts
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { End } from './end';
-import { Error } from './error';
-import { Metadata } from './metadata';
-import { Statedatafilter } from './statedatafilter';
-import { Transition } from './transition';
-import {
-  normalizeEndIfObject,
-  normalizeOnErrors,
-  normalizeTransitionIfObject,
-  normalizeUsedForCompensation,
-  overwriteEndIfObject,
-  overwriteMetadata,
-  overwriteOnErrors,
-  overwriteStateDataFilter,
-  overwriteTimeoutWithStateExecTimeout,
-  overwriteTransitionIfObject,
-  setEndValueIfNoTransition,
-} from './utils';
-import { StateExecTimeout } from './stateExecTimeout';
-
-export class Sleepstate {
-  constructor(model: any) {
-    const defaultModel = {
-      type: 'sleep',
-      usedForCompensation: false,
-    };
-    Object.assign(this, defaultModel, model);
-
-    overwriteEndIfObject(this);
-    overwriteStateDataFilter(this);
-    overwriteTimeoutWithStateExecTimeout(this);
-    overwriteOnErrors(this);
-    overwriteTransitionIfObject(this);
-    overwriteMetadata(this);
-  }
-
-  /**
-   * Unique State id
-   */
-  id?: string;
-  /**
-   * State name
-   */
-  name?: string;
-  /**
-   * State type
-   */
-  type?: 'sleep';
-  /**
-   * State end definition
-   */
-  end?: boolean | End;
-  /**
-   * State data filter
-   */
-  stateDataFilter?: Statedatafilter;
-  /**
-   * Duration (ISO 8601 duration format) to sleep
-   */
-  duration?: string;
-  /**
-   * State specific timeouts
-   */
-  timeouts?: {
-    stateExecTimeout?: StateExecTimeout;
-  };
-  /**
-   * States error handling definitions
-   */
-  onErrors?: Error[];
-  /**
-   * Next transition of the workflow after the workflow sleep
-   */
-  transition?: string | Transition;
-  /**
-   * Unique Name of a workflow state which is responsible for compensation of this state
-   */
-  compensatedBy?: string;
-  /**
-   * If true, this state is used to compensate another state. Default is false
-   */
-  usedForCompensation?: boolean;
-  metadata?: /* Metadata information */ Metadata;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Delaystate} without deleted properties.
-   */
-  normalize = (): Sleepstate => {
-    const clone = new Sleepstate(this);
-
-    normalizeEndIfObject(clone);
-    normalizeOnErrors(clone);
-    normalizeTransitionIfObject(clone);
-    normalizeUsedForCompensation(clone);
-    setEndValueIfNoTransition(clone);
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/specification.ts b/src/lib/definitions/specification.ts
deleted file mode 100644
index 1e60d0a4..00000000
--- a/src/lib/definitions/specification.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-export * from './workflow';
-export * from './action';
-export * from './actiondatafilter';
-export * from './authdef';
-export * from './basicpropsdef';
-export * from './bearerpropsdef';
-export * from './branch';
-export * from './callbackstate';
-export * from './continueasdef';
-export * from './correlationDef';
-export * from './crondef';
-export * from './databasedswitch';
-export * from './defaultconditiondef';
-export * from './end';
-export * from './enddatacondition';
-export * from './enddeventcondition';
-export * from './error';
-export * from './errordef';
-export * from './eventbasedswitch';
-export * from './eventdatafilter';
-export * from './eventdef';
-export * from './eventref';
-export * from './eventstate';
-export * from './foreachstate';
-export * from './function';
-export * from './functionref';
-export * from './injectstate';
-export * from './metadata';
-export * from './oauth2propsdef';
-export * from './onevents';
-export * from './operationstate';
-export * from './parallelstate';
-export * from './produceeventdef';
-export * from './retrydef';
-export * from './schedule';
-export * from './sleep';
-export * from './sleepstate';
-export * from './startdef';
-export * from './stateExecTimeout';
-export * from './statedatafilter';
-export * from './subflowref';
-export * from './timeouts';
-export * from './transition';
-export * from './transitiondatacondition';
-export * from './transitioneventcondition';
-export * from './workflow';
-export * from './workflowExecTimeout';
-export * from './types';
diff --git a/src/lib/definitions/startdef.ts b/src/lib/definitions/startdef.ts
deleted file mode 100644
index 27781075..00000000
--- a/src/lib/definitions/startdef.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { Schedule } from './schedule';
-import { overwriteScheduleIfObject } from './utils';
-
-export class Startdef {
-  constructor(model: any) {
-    Object.assign(this, model);
-
-    overwriteScheduleIfObject(this);
-  }
-
-  /**
-   * Name of the starting workflow state
-   */
-  stateName: string;
-  /**
-   * Define the time/repeating intervals or cron at which workflow instances should be automatically started.
-   */
-  schedule: string | Schedule;
-}
diff --git a/src/lib/definitions/stateExecTimeout.ts b/src/lib/definitions/stateExecTimeout.ts
deleted file mode 100644
index db3e31fa..00000000
--- a/src/lib/definitions/stateExecTimeout.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-export class StateExecTimeout {
-  constructor(model: any) {
-    Object.assign(this, model);
-  }
-
-  /**
-   * Single state execution timeout, not including retries (ISO 8601 duration format)
-   */
-  single?: string;
-  /**
-   * Total state execution timeout, including retries (ISO 8601 duration format)
-   */
-  total: string;
-}
diff --git a/src/lib/definitions/statedatafilter.ts b/src/lib/definitions/statedatafilter.ts
deleted file mode 100644
index a92f80d5..00000000
--- a/src/lib/definitions/statedatafilter.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-export class Statedatafilter {
-  constructor(model: any) {
-    Object.assign(this, model);
-  }
-
-  /**
-   * Workflow expression to filter the state data input
-   */
-  input?: string;
-  /**
-   * Workflow expression that filters the state data output
-   */
-  output?: string;
-}
diff --git a/src/lib/definitions/subflowref.ts b/src/lib/definitions/subflowref.ts
deleted file mode 100644
index 8b19baa0..00000000
--- a/src/lib/definitions/subflowref.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-export class Subflowref {
-  constructor(model: any) {
-    Object.assign(this, model);
-  }
-
-  /**
-   * Unique id of the sub-workflow to be invoked
-   */
-  workflowId: string;
-  /**
-   * Version of the sub-workflow to be invoked
-   */
-  version?: string;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Subflowref} without deleted properties.
-   */
-  normalize = (): Subflowref => {
-    const clone = new Subflowref(this);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/timeouts.ts b/src/lib/definitions/timeouts.ts
deleted file mode 100644
index 34433991..00000000
--- a/src/lib/definitions/timeouts.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { WorkflowExecTimeout } from './workflowExecTimeout';
-import { ActionExecTimeout, BranchExecTimeout, EventTimeout } from './types';
-import { normalizeWorkflowExecTimeout, overwriteStateExecTimeout, overwriteWorkflowExecTimeout } from './utils';
-import { StateExecTimeout } from './stateExecTimeout';
-
-export class Timeouts {
-  constructor(model: any) {
-    Object.assign(this, model);
-    overwriteWorkflowExecTimeout(this);
-    overwriteStateExecTimeout(this);
-  }
-
-  workflowExecTimeout?: WorkflowExecTimeout;
-  stateExecTimeout?: StateExecTimeout;
-  actionExecTimeout?: /* Single actions definition execution timeout duration (ISO 8601 duration format) */ ActionExecTimeout;
-  branchExecTimeout?: /* Single branch execution timeout duration (ISO 8601 duration format) */ BranchExecTimeout;
-  eventTimeout?: /* Timeout duration to wait for consuming defined events (ISO 8601 duration format) */ EventTimeout;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Exectimeout} without deleted properties.
-   */
-  normalize = (): Timeouts => {
-    const clone = new Timeouts(this);
-    normalizeWorkflowExecTimeout(clone);
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/transition.ts b/src/lib/definitions/transition.ts
deleted file mode 100644
index f9c68515..00000000
--- a/src/lib/definitions/transition.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { Produceeventdef } from './produceeventdef';
-import { normalizeCompensate, overwriteProduceEvents } from './utils';
-
-export class Transition {
-  constructor(model: any) {
-    const defaultModel = {
-      compensate: false,
-    };
-    Object.assign(this, defaultModel, model);
-
-    overwriteProduceEvents(this);
-  }
-
-  /**
-   * Name of state to transition to
-   */
-  nextState: string;
-  /**
-   * Array of events to be produced before the transition happens
-   */
-  produceEvents?: /* Produce an event and set its data */ Produceeventdef[];
-  /**
-   * If set to true, triggers workflow compensation when before this transition is taken. Default is false
-   */
-  compensate?: boolean;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Transition} without deleted properties.
-   */
-  normalize = (): Transition => {
-    const clone = new Transition(this);
-
-    normalizeCompensate(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/transitiondatacondition.ts b/src/lib/definitions/transitiondatacondition.ts
deleted file mode 100644
index c004edb5..00000000
--- a/src/lib/definitions/transitiondatacondition.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { Metadata } from './metadata';
-import { Transition } from './transition';
-import { normalizeTransitionIfObject, overwriteMetadata, overwriteTransitionIfObject } from './utils';
-
-export class Transitiondatacondition {
-  constructor(model: any) {
-    Object.assign(this, model);
-
-    overwriteTransitionIfObject(this);
-    overwriteMetadata(this);
-  }
-
-  /**
-   * Data condition name
-   */
-  name?: string;
-  /**
-   * Workflow expression evaluated against state data. Must evaluate to true or false
-   */
-  condition: string;
-  /**
-   * Workflow transition if condition is evaluated to true
-   */
-  transition: string | Transition;
-  metadata?: /* Metadata information */ Metadata;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Transitiondatacondition} without deleted properties.
-   */
-  normalize = (): Transitiondatacondition => {
-    const clone = new Transitiondatacondition(this);
-
-    normalizeTransitionIfObject(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/transitioneventcondition.ts b/src/lib/definitions/transitioneventcondition.ts
deleted file mode 100644
index 299ec4e5..00000000
--- a/src/lib/definitions/transitioneventcondition.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { Eventdatafilter } from './eventdatafilter';
-import { Metadata } from './metadata';
-import { Transition } from './transition';
-import {
-  normalizeTransitionIfObject,
-  overwriteEventDataFilter,
-  overwriteMetadata,
-  overwriteTransitionIfObject,
-} from './utils';
-
-export class Transitioneventcondition {
-  constructor(model: any) {
-    Object.assign(this, model);
-
-    overwriteTransitionIfObject(this);
-    overwriteEventDataFilter(this);
-    overwriteMetadata(this);
-  }
-
-  /**
-   * Event condition name
-   */
-  name?: string;
-  /**
-   * References an unique event name in the defined workflow events
-   */
-  eventRef: string;
-  /**
-   * Next transition of the workflow if there is valid matches
-   */
-  transition: string | Transition;
-  /**
-   * Event data filter definition
-   */
-  eventDataFilter?: Eventdatafilter;
-  metadata?: /* Metadata information */ Metadata;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Transitioneventcondition} without deleted properties.
-   */
-  normalize = (): Transitioneventcondition => {
-    const clone = new Transitioneventcondition(this);
-
-    normalizeTransitionIfObject(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/definitions/types.ts b/src/lib/definitions/types.ts
deleted file mode 100644
index b9343fe1..00000000
--- a/src/lib/definitions/types.ts
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { CorrelationDef } from './correlationDef';
-import { Transitiondatacondition } from './transitiondatacondition';
-import { Enddatacondition } from './enddatacondition';
-import { Retrydef } from './retrydef';
-import { Function } from './function';
-import { Databasedswitch } from './databasedswitch';
-import { Eventbasedswitch } from './eventbasedswitch';
-import { Transitioneventcondition } from './transitioneventcondition';
-import { Enddeventcondition } from './enddeventcondition';
-import { Eventstate } from './eventstate';
-import { Operationstate } from './operationstate';
-import { Parallelstate } from './parallelstate';
-import { Injectstate } from './injectstate';
-import { Foreachstate } from './foreachstate';
-import { Callbackstate } from './callbackstate';
-import { Eventdef } from './eventdef';
-import { Sleepstate } from './sleepstate';
-import { Authdef } from './authdef';
-import { Errordef } from './errordef';
-import { Specification } from './index';
-
-export type CorrelationDefs = [
-  /* CloudEvent correlation definition */ CorrelationDef,
-  .../* CloudEvent correlation definition */ CorrelationDef[]
-];
-
-export type Datacondition /* Switch state data based condition */ =
-  | Transitiondatacondition
-  | /* Switch state data based condition */ Enddatacondition;
-
-export type Retries = string /* uri */ | [Retrydef, ...Retrydef[]];
-
-export type Functions = string /* uri */ | [Function, ...Function[]];
-
-export type Switchstate /* Permits transitions to other states based on data conditions */ =
-  | Databasedswitch
-  | /* Permits transitions to other states based on events */ Eventbasedswitch;
-
-export type Eventcondition /* Switch state data event condition */ =
-  | Transitioneventcondition
-  | /* Switch state data event condition */ Enddeventcondition;
-
-export type States = [
-  (
-    | /* Causes the workflow execution to sleep for a specified duration */ Sleepstate
-    | /* This state is used to wait for events from event sources, then consumes them and invoke one or more actions to run in sequence or parallel */ Eventstate
-    | /* Defines actions be performed. Does not wait for incoming events */ Operationstate
-    | /* Consists of a number of states that are executed in parallel */ Parallelstate
-    | Switchstate
-    | /* Inject static data into state data. Does not perform any actions */ Injectstate
-    | /* Execute a set of defined actions or workflows for each element of a data array */ Foreachstate
-    | /* This state performs an action, then waits for the callback event that denotes completion of the action */ Callbackstate
-  ),
-  ...(
-    | /* Causes the workflow execution to sleep for a specified duration */ Sleepstate
-    | /* This state is used to wait for events from event sources, then consumes them and invoke one or more actions to run in sequence or parallel */ Eventstate
-    | /* Defines actions be performed. Does not wait for incoming events */ Operationstate
-    | /* Consists of a number of states that are executed in parallel */ Parallelstate
-    | Switchstate
-    | /* Inject static data into state data. Does not perform any actions */ Injectstate
-    | /* Execute a set of defined actions or workflows for each element of a data array */ Foreachstate
-    | /* This state performs an action, then waits for the callback event that denotes completion of the action */ Callbackstate
-  )[]
-];
-
-/**
- * Single branch execution timeout duration (ISO 8601 duration format)
- */
-export type BranchExecTimeout = string;
-
-/**
- * Single actions definition execution timeout duration (ISO 8601 duration format)
- */
-export type ActionExecTimeout = string;
-
-/**
- * Timeout duration to wait for consuming defined events (ISO 8601 duration format)
- */
-export type EventTimeout = string;
-
-export type Secrets = string /* uri */ | [string, ...string[]];
-
-export type Events = string /* uri */ | [Eventdef, ...Eventdef[]];
-
-export type Auth = string /* uri */ | [Authdef, ...Authdef[]];
-
-export type Errors = string /* uri */ | [Errordef, ...Errordef[]];
-
-export type Properties = Specification.Basicpropsdef | Specification.Bearerpropsdef | Specification.Oauth2propsdef;
diff --git a/src/lib/definitions/utils.ts b/src/lib/definitions/utils.ts
deleted file mode 100644
index a86b25de..00000000
--- a/src/lib/definitions/utils.ts
+++ /dev/null
@@ -1,779 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { Specification } from './index';
-import { isObject } from '../utils';
-import { StateExecTimeout } from './stateExecTimeout';
-
-/**
- * Modify the provided object, set the value to 'schedule' property as an instance of Specification.Schedule class, if the provided value is an object
- * @param object to set/overwrite the property
- */
-export function overwriteScheduleIfObject(object: { schedule: string | Specification.Schedule }): void {
-  if (isObject(object.schedule)) {
-    object.schedule = new Specification.Schedule(object.schedule);
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'start' property as an instance of Specification.Startdef class, if the provided value is an object
- * @param object to set/overwrite the property
- */
-export function overwriteStartIfObject(object: { start: string | Specification.Startdef }): void {
-  if (isObject(object.start)) {
-    object.start = new Specification.Startdef(object.start);
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'end' property as an instance of Specification.End class, if the provided value is an object
- * @param object to set/overwrite the property
- */
-export function overwriteEndIfObject(object: { end?: boolean | Specification.End }): void {
-  if (isObject(object.end)) {
-    object.end = new Specification.End(object.end);
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'cron' property as an instance of Specification.Crondef class, if the provided value is an object
- * @param object to set/overwrite the property
- */
-export function overwriteCronIfObject(object: { cron?: string | Specification.Crondef }): void {
-  if (isObject(object.cron)) {
-    object.cron = new Specification.Crondef(object.cron);
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'transition' property as an instance of Specification.Transition class, if the provided value is an object
- * @param object to set/overwrite the property
- */
-export function overwriteTransitionIfObject(object: { transition?: string | Specification.Transition }): void {
-  if (isObject(object.transition)) {
-    object.transition = new Specification.Transition(object.transition);
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'defaultCondition' property as an instance of Specification.Defaultconditiondef class
- * @param object to set/overwrite the property
- */
-export function overwriteDefaultCondition(object: { defaultCondition?: Specification.Defaultconditiondef }): void {
-  object.defaultCondition = object.defaultCondition && new Specification.Defaultconditiondef(object.defaultCondition);
-}
-
-/**
- * Modify the provided object, set the value to 'eventConditions' property as an instance of Specification.Eventcondition[] class
- * Throws an error if provided value is neither a Transitioneventcondition nor a Enddeventcondition
- * @param object to set/overwrite the property
- */
-export function overwriteEventConditions(object: { eventConditions: Specification.Eventcondition[] }): void {
-  if (Array.isArray(object.eventConditions)) {
-    object.eventConditions = object.eventConditions.map((eventCondition: any) => {
-      if (eventCondition.transition) {
-        return new Specification.Transitioneventcondition(eventCondition);
-      }
-
-      if (eventCondition.end) {
-        return new Specification.Enddeventcondition(eventCondition);
-      }
-
-      throw new Error(
-        `Provided value is neither Transitioneventcondition nor Enddeventcondition \n data= ${eventCondition} `
-      );
-    });
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'dataConditions' property as an instance of Specification.Datacondition[] class
- * Throws an error if provided value is neither a Transitiondatacondition nor a Enddatacondition
- * @param object to set/overwrite the property
- */
-export function overwriteDataConditions(object: { dataConditions: Specification.Datacondition[] }): void {
-  if (Array.isArray(object.dataConditions)) {
-    object.dataConditions = object.dataConditions.map((dataCondition: any) => {
-      if (dataCondition.transition) {
-        return new Specification.Transitiondatacondition(dataCondition);
-      }
-
-      if (dataCondition.end) {
-        return new Specification.Enddatacondition(dataCondition);
-      }
-
-      throw new Error(
-        `Provided value is neither Transitiondatacondition nor Enddatacondition \n data= ${dataCondition} `
-      );
-    });
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'actions' property as an instance of Specification.Action[] class
- * @param object to set/overwrite the property
- */
-export function overwriteActions(object: { actions?: Specification.Action[] }): void {
-  if (Array.isArray(object.actions)) {
-    object.actions = object.actions.map((v) => new Specification.Action(v));
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'onEvents' property as an instance of Specification.Onevents[] class
- * @param object to set/overwrite the property
- */
-export function overwriteOnEvents(object: { onEvents: Specification.Onevents[] }): void {
-  object.onEvents = object.onEvents.map((event) => new Specification.Onevents(event));
-}
-
-/**
- * Modify the provided object, set the value to 'stateDataFilter' property as an instance of Specification.Statedatafilter class
- * @param object to set/overwrite the property
- */
-export function overwriteStateDataFilter(object: { stateDataFilter?: Specification.Statedatafilter }): void {
-  object.stateDataFilter = object.stateDataFilter && new Specification.Statedatafilter(object.stateDataFilter);
-}
-
-/**
- * Modify the provided object, set the value to 'metadata' property as an instance of Specification.Metadata class
- * @param object to set/overwrite the property
- */
-export function overwriteMetadata(object: { metadata?: Specification.Metadata }): void {
-  object.metadata = object.metadata && new Specification.Metadata(object.metadata);
-}
-
-/**
- * Modify the provided object, set the value to 'retries' property as an instance of Specification.Retries class
- * @param object to set/overwrite the property
- */
-export function overwriteRetries(object: { retries?: Specification.Retries }) {
-  if (Array.isArray(object.retries)) {
-    object.retries = (object.retries as Specification.Retrydef[]).map(
-      (f) => new Specification.Retrydef(f)
-    ) as Specification.Retries;
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'events' property as an instance of Specification.Events class
- * @param object to set/overwrite the property
- */
-export function overwriteEvents(object: { events?: Specification.Events }) {
-  if (Array.isArray(object.events)) {
-    object.events = (object.events as Specification.Eventdef[]).map(
-      (f) => new Specification.Eventdef(f)
-    ) as Specification.Events;
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'errors' property as an instance of Specification.Errors class
- * @param object to set/overwrite the property
- */
-export function overwriteErrors(object: { errors?: Specification.Errors }) {
-  if (Array.isArray(object.errors)) {
-    object.errors = (object.errors as Specification.Errordef[]).map(
-      (f) => new Specification.Errordef(f)
-    ) as Specification.Errors;
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'auth' property as an instance of Specification.Auth class
- * @param object to set/overwrite the property
- */
-export function overwriteAuth(object: { auth?: Specification.Auth }) {
-  if (Array.isArray(object.auth)) {
-    object.auth = (object.auth as Specification.Authdef[]).map(
-      (f) => new Specification.Authdef(f)
-    ) as Specification.Auth;
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'functions' property as an instance of Specification.Functions class
- * @param object to set/overwrite the property
- */
-export function overwriteFunctions(object: { functions?: Specification.Functions }) {
-  if (Array.isArray(object.functions)) {
-    object.functions = (object.functions as Specification.Function[]).map(
-      (f) => new Specification.Function(f)
-    ) as Specification.Functions;
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'states' property as an instance of Specification.States class
- * Throws an error if the value of the property type is not handler
- * @param object to set/overwrite the property
- */
-export function overwriteStates(object: { states: Specification.States }) {
-  object.states =
-    object.states &&
-    ((object.states as Specification.States).map((v) => {
-      switch (v.type) {
-        case 'sleep':
-          return new Specification.Sleep(v);
-        case 'event':
-          return new Specification.Eventstate(v);
-        case 'operation':
-          return new Specification.Operationstate(v);
-        case 'parallel':
-          return new Specification.Parallelstate(v);
-        case 'switch':
-          const switchState: any = v;
-          if (switchState.dataConditions) {
-            return new Specification.Databasedswitch(v);
-          }
-          if (switchState.eventConditions) {
-            return new Specification.Eventbasedswitch(v);
-          }
-          throw new Error(`Unexpected switch type; \n state value= ${JSON.stringify(v, null, 4)}`);
-        case 'inject':
-          return new Specification.Injectstate(v);
-        case 'foreach':
-          return new Specification.Foreachstate(v);
-        case 'callback':
-          return new Specification.Callbackstate(v);
-        default:
-          throw new Error(`Unexpected type= ${v.type}; \n state value= ${JSON.stringify(v, null, 4)}`);
-      }
-    }) as Specification.States);
-}
-
-/**
- * Modify the provided object, set the value to 'properties' property as an instance of Specification.Properties class, if the provided value is an object
- * Throws an error if the value of the property type is not handler
- * @param object to set/overwrite the property
- */
-export function overwritePropertiesIfObject(object: { properties: string | Specification.Properties }) {
-  if (isObject(object.properties)) {
-    const properties: any = object.properties;
-
-    if (properties.username && properties.password) {
-      object.properties = new Specification.Basicpropsdef(object);
-    }
-
-    if (properties.token) {
-      object.properties = new Specification.Bearerpropsdef(object);
-    }
-
-    if (properties.grantType) {
-      object.properties = new Specification.Oauth2propsdef(object);
-    }
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'correlation' property as an instance of Specification.CorrelationDefs class
- * @param object to set/overwrite the property
- */
-export function overwriteCorrelation(object: { correlation?: Specification.CorrelationDefs }): void {
-  if (Array.isArray(object.correlation)) {
-    object.correlation = object.correlation.map(
-      (correlation) => new Specification.CorrelationDef(correlation)
-    ) as Specification.CorrelationDefs;
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'action' property as an instance of Specification.Action class
- * @param object to set/overwrite the property
- */
-export function overwriteAction(object: { action?: Specification.Action }): void {
-  object.action = object.action && new Specification.Action(object.action);
-}
-
-/**
- * Modify the provided object, set the value to 'workflowExecTimeout' property as an instance of Specification.WorkflowExecTimeout class
- * @param object to set/overwrite the property
- */
-export function overwriteWorkflowExecTimeout(object: {
-  workflowExecTimeout?: Specification.WorkflowExecTimeout;
-}): void {
-  object.workflowExecTimeout =
-    object.workflowExecTimeout && new Specification.WorkflowExecTimeout(object.workflowExecTimeout);
-}
-
-/**
- * Modify the provided object, set the value to 'stateExecTimeout' property as an instance of Specification.StateExecTimeout class
- * @param object to set/overwrite the property
- */
-export function overwriteStateExecTimeout(object: { stateExecTimeout?: Specification.StateExecTimeout }): void {
-  object.stateExecTimeout = object.stateExecTimeout && new Specification.StateExecTimeout(object.stateExecTimeout);
-}
-
-/**
- * Modify the provided object, set the value to 'eventDataFilter' property as an instance of Specification.Eventdatafilter class
- * @param object to set/overwrite the property
- */
-export function overwriteEventDataFilter(object: { eventDataFilter?: Specification.Eventdatafilter }): void {
-  object.eventDataFilter = object.eventDataFilter && new Specification.Eventdatafilter(object.eventDataFilter);
-}
-
-/**
- * Modify the provided object, set the value to 'onErrors' property as an instance of Specification.Error[] class
- * @param object to set/overwrite the property
- */
-export function overwriteOnErrors(object: { onErrors?: Specification.Error[] }): void {
-  if (Array.isArray(object.onErrors)) {
-    object.onErrors = object.onErrors.map((error) => new Specification.Error(error));
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'branches' property as an instance of Specification.Branch[] class
- * @param object to set/overwrite the property
- */
-export function overwriteBranches(object: { branches?: Specification.Branch[] }): void {
-  if (Array.isArray(object.branches)) {
-    object.branches = object.branches.map((v) => new Specification.Branch(v));
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'produceEvents' property as an instance of Specification.Produceeventdef[] class
- * @param object to set/overwrite the property
- */
-export function overwriteProduceEvents(object: { produceEvents?: Specification.Produceeventdef[] }): void {
-  if (Array.isArray(object.produceEvents)) {
-    object.produceEvents = object.produceEvents.map((produceEvent) => new Specification.Produceeventdef(produceEvent));
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'functionRef' property as an instance of Specification.Functionref class, if the provided value is an object
- * @param object to set/overwrite the property
- */
-export function overwriteFunctionRefIfObject(object: { functionRef?: string | Specification.Functionref }): void {
-  if (isObject(object.functionRef)) {
-    object.functionRef = new Specification.Functionref(object.functionRef);
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'continueAs' property as an instance of Specification. Continueasdef, if the provided value is an object
- * @param object to set/overwrite the property
- */
-export function overwriteContinueAsIfObject(object: { continueAs?: string | Specification.Continueasdef }): void {
-  if (isObject(object.continueAs)) {
-    object.continueAs = new Specification.Continueasdef(object.continueAs);
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'subFlowRef' property as an instance of Specification.Subflowref class, if the provided value is an object
- * @param object to set/overwrite the property
- */
-export function overwriteSubFlowRefIfObject(object: { subFlowRef?: string | Specification.Subflowref }): void {
-  if (isObject(object.subFlowRef)) {
-    object.subFlowRef = new Specification.Subflowref(object.subFlowRef);
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'eventRef' property as an instance of Specification.Eventref class
- * @param object to set/overwrite the property
- */
-export function overwriteEventRef(object: { eventRef?: Specification.Eventref }): void {
-  object.eventRef = object.eventRef && new Specification.Eventref(object.eventRef);
-}
-
-/**
- * Modify the provided object, set the value to 'sleep' property as an instance of Specification.Sleep class
- * @param object to set/overwrite the property
- */
-export function overwriteSleep(object: { sleep?: Specification.Sleep }): void {
-  object.sleep = object.sleep && new Specification.Sleep(object.sleep);
-}
-
-/**
- * Modify the provided object, set the value to 'actionDataFilter' property as an instance of Specification.Actiondatafilter class
- * @param object to set/overwrite the property
- */
-export function overwriteActionDataFilter(object: { actionDataFilter?: Specification.Actiondatafilter }): void {
-  object.actionDataFilter = object.actionDataFilter && new Specification.Actiondatafilter(object.actionDataFilter);
-}
-
-/**
- * Set end to true if neither nor transition properties are defined
- * @param object to modify
- */
-export function setEndValueIfNoTransition(object: {
-  transition?: string | Specification.Transition;
-  end?: boolean | Specification.End;
-}): void {
-  if (!object.end && !object.transition) {
-    object.end = true;
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'end' property.
- * @param object to be modified
- */
-export function normalizeEndIfObject(object: { end?: boolean | Specification.End }) {
-  if (isObject(object.end)) {
-    object.end = (object.end as Specification.End).normalize();
-  }
-}
-
-/**
- * Modify the provided object, deep cloning the value of the provided property
- * @param property to be cloned
- * @param object to set/overwrite the property
- */
-export function overwritePropertyAsPlainType(property: string, object: any): void {
-  if (isObject(object[property])) {
-    Object.assign(object, { [property]: JSON.parse(JSON.stringify(object[property])) });
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'timeouts.stateExecTimeout' property as an instance of Specification.StateExecTimeout class,
- * for the rest of the properties the value is cloned
- * @param object to set/overwrite the property
- */
-export function overwriteTimeoutWithStateExecTimeout(object: {
-  timeouts?: {
-    stateExecTimeout?: StateExecTimeout;
-  };
-}): void {
-  overwritePropertyAsPlainType('timeouts', object);
-
-  const timeouts = object.timeouts!;
-  if (timeouts && isObject(timeouts.stateExecTimeout)) {
-    timeouts.stateExecTimeout = new Specification.StateExecTimeout(timeouts.stateExecTimeout);
-  }
-}
-
-/**
- * Modify the provided object, set the value to 'timeouts' property as an instance of Specification.Timeouts class
- * @param object to set/overwrite the property
- */
-export function overwriteTimeoutsIfObject(object: { timeouts?: string | Specification.Timeouts }): void {
-  if (isObject(object.timeouts)) {
-    object.timeouts = object.timeouts && new Specification.Timeouts(object.timeouts);
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'subFlowRef' property.
- * @param object to be modified
- */
-export function normalizeSubFlowRefIfObject(object: { subFlowRef?: string | Specification.Subflowref }) {
-  if (isObject(object.subFlowRef)) {
-    object.subFlowRef = (object.subFlowRef as Specification.Subflowref).normalize();
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'continueAs' property.
- * @param object to be modified
- */
-export function normalizeContinueAsIfObject(object: { continueAs?: string | Specification.Continueasdef }) {
-  if (isObject(object.continueAs)) {
-    object.continueAs = (object.continueAs as Specification.Continueasdef).normalize();
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'defaultCondition' property.
- * @param object to be modified
- */
-export function normalizeDefaultCondition(object: { defaultCondition?: Specification.Defaultconditiondef }) {
-  object.defaultCondition = object.defaultCondition && object.defaultCondition.normalize();
-}
-
-/**
- * Modify the provided object by normalizing the 'workflowExecTimeout' property.
- * @param object to be modified
- */
-export function normalizeWorkflowExecTimeout(object: { workflowExecTimeout?: Specification.WorkflowExecTimeout }) {
-  object.workflowExecTimeout = object.workflowExecTimeout && object.workflowExecTimeout.normalize();
-}
-
-/**
- * Modify the provided object by normalizing the 'actionMode' property, where the default value is 'sequential'.
- * @param object to be modified
- */
-export function normalizeActionMode(object: { actionMode?: string }) {
-  if (object.actionMode === 'sequential') {
-    delete object.actionMode;
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'completionType' property, where the default value is 'allOf'.
- * @param object to be modified
- */
-export function normalizeCompletionType(object: { completionType?: string }) {
-  if (object.completionType === 'allOf') {
-    delete object.completionType;
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'usedForCompensation' property, where the default value is 'false'.
- * @param object to be modified
- */
-export function normalizeUsedForCompensation(object: { usedForCompensation?: boolean }) {
-  if (!object.usedForCompensation) {
-    delete object.usedForCompensation;
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'mode' property, where the default value is 'parallel'.
- * @param object to be modified
- */
-export function normalizeMode(object: { mode?: string }) {
-  if (object.mode === 'parallel') {
-    delete object.mode;
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'onEvents' property.
- * @param object to be modified
- */
-export function normalizeOnEvents(object: { onEvents: Specification.Onevents[] }) {
-  object.onEvents = object.onEvents && object.onEvents.map((onEvent) => onEvent.normalize());
-}
-
-/**
- * Modify the provided object by normalizing the 'onErrors' property.
- * @param object to be modified
- */
-export function normalizeOnErrors(object: { onErrors?: Specification.Error[] }): void {
-  if (Array.isArray(object.onErrors)) {
-    object.onErrors = object.onErrors.map((error) => error.normalize());
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'branches' property.
- * @param object to be modified
- */
-export function normalizeBranches(object: { branches?: Specification.Branch[] }): void {
-  if (Array.isArray(object.branches)) {
-    object.branches = object.branches.map((branch) => branch.normalize());
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'actions' property.
- * @param object to be modified
- */
-export function normalizeActions(object: { actions?: Specification.Action[] }): void {
-  if (Array.isArray(object.actions)) {
-    object.actions = object.actions.map((action) => action.normalize());
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'action' property.
- * @param object to be modified
- */
-export function normalizeAction(object: { action?: Specification.Action }): void {
-  object.action = object.action && object.action.normalize();
-}
-
-/**
- * Modify the provided object by normalizing the 'dataConditions' property.
- * @param object to be modified
- */
-export function normalizeDataConditions(object: { dataConditions?: Specification.Datacondition[] }): void {
-  if (Array.isArray(object.dataConditions)) {
-    object.dataConditions = object.dataConditions.map((dc) => dc.normalize());
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'eventConditions' property.
- * @param object to be modified
- */
-export function normalizeEventConditions(object: { eventConditions?: Specification.Eventcondition[] }): void {
-  if (Array.isArray(object.eventConditions)) {
-    object.eventConditions = object.eventConditions.map((event) => event.normalize());
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'transition' property if property type is Specification.Transition.
- * @param object to be modified
- */
-export function normalizeTransitionIfObject(object: { transition?: string | Specification.Transition }) {
-  if (isObject(object.transition)) {
-    object.transition = (object.transition as Specification.Transition).normalize();
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'compensate' property, where the default value is 'false'.
- * @param object to be modified
- */
-export function normalizeCompensate(object: { compensate?: boolean }) {
-  if (!object.compensate) {
-    delete object.compensate;
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'scheme' property, where the default value is 'basic'.
- * @param object to be modified
- */
-export function normalizeScheme(object: { scheme?: string }) {
-  if (object.scheme === 'basic') {
-    delete object.scheme;
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'terminate' property, where the default value is 'false'.
- * @param object to be modified
- */
-export function normalizeTerminate(object: { terminate?: boolean }) {
-  if (!object.terminate) {
-    delete object.terminate;
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'exclusive' property, where the default value is 'true'.
- * @param object to be modified
- */
-export function normalizeExclusive(object: { exclusive?: boolean }) {
-  if (object.exclusive) {
-    delete object.exclusive;
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'keepActive' property, where the default value is 'true'.
- * @param object to be modified
- */
-export function normalizeKeepActive(object: { keepActive?: boolean }) {
-  if (object.keepActive) {
-    delete object.keepActive;
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'expressionLang' property, where the default value is 'jq'.
- * @param object to be modified
- */
-export function normalizeExpressionLang(object: { expressionLang?: string }) {
-  if (object.expressionLang === 'jq') {
-    delete object.expressionLang;
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'interrupt' property, where the default value is 'true'.
- * @param object to be modified
- */
-export function normalizeInterrupt(object: { interrupt?: boolean }) {
-  if (object.interrupt) {
-    delete object.interrupt;
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'type' property, where the default value is 'rest'.
- * @param object to be modified
- */
-export function normalizeType(object: { type?: string }) {
-  if (object.type === 'rest') {
-    delete object.type;
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'kind' property, where the default value is 'consumed'.
- * @param object to be modified
- */
-export function normalizeKind(object: { kind?: string }) {
-  if (object.kind === 'consumed') {
-    delete object.kind;
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'dataOnly' property, where the default value is 'true'.
- * @param object to be modified
- */
-export function normalizeDataOnly(object: { dataOnly?: boolean }) {
-  if (object.dataOnly) {
-    delete object.dataOnly;
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'states' property.
- * @param object to be modified
- */
-export function normalizeStates(object: { states: Specification.States }) {
-  object.states = object.states.map((state) => {
-    return state.normalize();
-  }) as Specification.States;
-}
-
-/**
- * Modify the provided object by normalizing the 'auth' property.
- * @param object to be modified
- */
-export function normalizeAuth(object: { auth?: Specification.Auth }) {
-  if (Array.isArray(object.auth)) {
-    object.auth = object.auth.map((auth) => {
-      return auth.normalize();
-    }) as Specification.Auth;
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'functions' property.
- * @param object to be modified
- */
-export function normalizeFunctions(object: { functions?: Specification.Functions }) {
-  if (Array.isArray(object.functions)) {
-    object.functions = (object.functions as Specification.Function[]).map((f) =>
-      f.normalize()
-    ) as Specification.Functions;
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'events' property.
- * @param object to be modified
- */
-export function normalizeEvents(object: { events?: Specification.Events }) {
-  if (Array.isArray(object.events)) {
-    object.events = (object.events as Specification.Eventdef[]).map((event) =>
-      event.normalize()
-    ) as Specification.Events;
-  }
-}
-
-/**
- * Modify the provided object by normalizing the 'timeouts' property.
- * @param object to be modified
- */
-export function normalizeTimeoutsIfObject(object: { timeouts?: string /* uri */ | Specification.Timeouts }) {
-  if (isObject(object.timeouts)) {
-    object.timeouts = object.timeouts && object.timeouts.normalize();
-  }
-}
diff --git a/src/lib/definitions/workflow.ts b/src/lib/definitions/workflow.ts
deleted file mode 100644
index e51bca49..00000000
--- a/src/lib/definitions/workflow.ts
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Metadata } from './metadata';
-import { Startdef } from './startdef';
-import { Timeouts } from './timeouts';
-import * as yaml from 'js-yaml';
-
-import { Specification } from '.';
-
-import { validate } from '../utils';
-import {
-  normalizeAuth,
-  normalizeEvents,
-  normalizeExpressionLang,
-  normalizeFunctions,
-  normalizeKeepActive,
-  normalizeStates,
-  normalizeTimeoutsIfObject,
-  overwriteAuth,
-  overwriteErrors,
-  overwriteEvents,
-  overwriteFunctions,
-  overwriteMetadata,
-  overwritePropertyAsPlainType,
-  overwriteRetries,
-  overwriteStartIfObject,
-  overwriteStates,
-  overwriteTimeoutsIfObject,
-} from './utils';
-import { Auth, Errors, Events, Functions, Retries, Secrets, States } from './types';
-
-export class Workflow {
-  constructor(model: any) {
-    const defaultModel = {
-      expressionLang: 'jq',
-      keepActive: true,
-    } as Specification.Workflow;
-
-    Object.assign(this, defaultModel, model);
-
-    overwritePropertyAsPlainType('dataInputSchema', this);
-    overwritePropertyAsPlainType('constants', this);
-    overwriteStartIfObject(this);
-    overwriteTimeoutsIfObject(this);
-    overwriteErrors(this);
-    overwriteMetadata(this);
-    overwriteEvents(this);
-    overwriteFunctions(this);
-    overwriteRetries(this);
-    overwriteAuth(this);
-    overwriteStates(this);
-  }
-  /**
-   * Workflow unique identifier
-   */
-  id: string;
-  /**
-   * Domain-specific workflow identifier
-   */
-  key?: string;
-  /**
-   * Workflow name
-   */
-  name: string;
-  /**
-   * Workflow description
-   */
-  description?: string;
-  /**
-   * Workflow version
-   */
-  version?: string;
-  /**
-   * List of helpful terms describing the workflows intended purpose, subject areas, or other important qualities
-   */
-  annotations?: [string, ...string[]];
-  dataInputSchema?:
-    | string
-    | {
-        /**
-         * URI of the JSON Schema used to validate the workflow data input
-         */
-        schema: string;
-        /**
-         * Determines if workflow execution should continue if there are validation errors
-         */
-        failOnValidationErrors: boolean;
-      };
-  secrets?: Secrets;
-  constants?:
-    | string /* uri */
-    | {
-        [key: string]: any;
-      };
-  start: string | Startdef;
-  /**
-   * Serverless Workflow schema version
-   */
-  specVersion: string;
-  /**
-   * Identifies the expression language used for workflow expressions. Default is 'jq'
-   */
-  expressionLang?: string;
-  timeouts?: string /* uri */ | Timeouts;
-  errors?: Errors;
-  /**
-   * If 'true', workflow instances is not terminated when there are no active execution paths. Instance can be terminated via 'terminate end definition' or reaching defined 'workflowExecTimeout'
-   */
-  keepActive?: boolean;
-  metadata?: /* Metadata information */ Metadata;
-  events?: Events;
-  functions?: Functions;
-  /**
-   * If set to true, actions should automatically be retried on unchecked errors. Default is false
-   */
-  autoRetries?: boolean;
-  retries?: Retries;
-  auth?: Auth;
-  /**
-   * State definitions
-   */
-  states: States;
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.Workflow} without deleted properties.
-   */
-  normalize = (): Workflow => {
-    const clone = new Workflow(this);
-
-    normalizeExpressionLang(clone);
-    normalizeTimeoutsIfObject(clone);
-    normalizeKeepActive(clone);
-    normalizeEvents(clone);
-    normalizeFunctions(clone);
-    normalizeAuth(clone);
-    normalizeStates(clone);
-
-    return clone;
-  };
-
-  /**
-   * Parses the provided string as Workflow
-   * @param {string} data The JSON or YAML workflow to parse
-   * @returns {Workflow} The parse Workflow
-   */
-  static fromSource(value: string): Specification.Workflow {
-    try {
-      const model = yaml.load(value);
-      return new Workflow(model);
-    } catch (ex) {
-      throw new Error('Format not supported');
-    }
-  }
-
-  /**
-   * Stringifies the provided workflow to the JSON format
-   * @param {Workflow} workflow The workflow to strigify
-   * @returns {string} The workflow as JSON
-   */
-  static toJson(workflow: Workflow): string {
-    validate('Workflow', workflow);
-    return JSON.stringify(workflow.normalize());
-  }
-
-  /**
-   * Stringifies the provided workflow to the YAML format
-   * @param {Workflow} workflow The workflow to strigify
-   * @returns {string} The workflow as YAML
-   */
-  static toYaml(workflow: Workflow): string {
-    validate('Workflow', workflow);
-    return yaml.dump(JSON.parse(JSON.stringify(workflow.normalize())));
-  }
-}
diff --git a/src/lib/definitions/workflowExecTimeout.ts b/src/lib/definitions/workflowExecTimeout.ts
deleted file mode 100644
index a0b04834..00000000
--- a/src/lib/definitions/workflowExecTimeout.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { normalizeInterrupt } from './utils';
-
-export class WorkflowExecTimeout {
-  constructor(model: any) {
-    const defaultModel = { interrupt: true };
-    Object.assign(this, defaultModel, model);
-  }
-
-  /**
-   * Workflow execution timeout duration (ISO 8601 duration format). If not specified should be 'unlimited'
-   */
-  duration: string;
-  /**
-   * If `false`, workflow instance is allowed to finish current execution. If `true`, current workflow execution is abrupted.
-   */
-  interrupt?: boolean;
-  /**
-   * Name of a workflow state to be executed before workflow instance is terminated
-   */
-  runBefore?: string;
-
-  /**
-   * Normalize the value of each property by recursively deleting properties whose value is equal to its default value. Does not modify the object state.
-   * @returns {Specification.WorkflowExecTimeout} without deleted properties.
-   */
-
-  normalize = (): WorkflowExecTimeout => {
-    const clone = new WorkflowExecTimeout(this);
-
-    normalizeInterrupt(clone);
-
-    return clone;
-  };
-}
diff --git a/src/lib/builders/README.md b/src/lib/generated/builders/README.md
similarity index 100%
rename from src/lib/builders/README.md
rename to src/lib/generated/builders/README.md
diff --git a/src/lib/generated/builders/all-event-consumption-strategy-builder.ts b/src/lib/generated/builders/all-event-consumption-strategy-builder.ts
new file mode 100644
index 00000000..e5de7ed3
--- /dev/null
+++ b/src/lib/generated/builders/all-event-consumption-strategy-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { AllEventConsumptionStrategyIntersection } from '../classes/all-event-consumption-strategy';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.AllEventConsumptionStrategy} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {AllEventConsumptionStrategyIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.AllEventConsumptionStrategy,
+  options: BuildOptions,
+): AllEventConsumptionStrategyIntersection {
+  const instance = new Classes.AllEventConsumptionStrategy(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as AllEventConsumptionStrategyIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `AllEventConsumptionStrategyIntersection`
+ * @returns {Builder} A builder for `AllEventConsumptionStrategyIntersection`
+ */
+export const allEventConsumptionStrategyBuilder = (
+  model?: Partial,
+): Builder, AllEventConsumptionStrategyIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/all-event-consumption-strategy-configuration-builder.ts b/src/lib/generated/builders/all-event-consumption-strategy-configuration-builder.ts
new file mode 100644
index 00000000..c9119f6b
--- /dev/null
+++ b/src/lib/generated/builders/all-event-consumption-strategy-configuration-builder.ts
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { arrayBuilder, ArrayBuilder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { AllEventConsumptionStrategyConfigurationIntersection } from '../classes/all-event-consumption-strategy-configuration';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying array
+ * @param {Specification.AllEventConsumptionStrategyConfiguration} model The proxied array
+ * @param {BuildOptions} options The build options to use
+ * @returns {AllEventConsumptionStrategyConfigurationIntersection} The built array
+ */
+function buildingFn(
+  model: Specification.AllEventConsumptionStrategyConfiguration,
+  options: BuildOptions,
+): AllEventConsumptionStrategyConfigurationIntersection {
+  const instance = new Classes.AllEventConsumptionStrategyConfiguration(model);
+  if (options.validate) instance.validate();
+  return (options.normalize
+    ? instance.normalize()
+    : instance) as unknown as AllEventConsumptionStrategyConfigurationIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `AllEventConsumptionStrategyConfigurationIntersection`
+ * @returns {ArrayBuilder} A builder for `AllEventConsumptionStrategyConfigurationIntersection`
+ */
+export const allEventConsumptionStrategyConfigurationBuilder = (
+  model?: Specification.AllEventConsumptionStrategyConfiguration,
+): ArrayBuilder =>
+  arrayBuilder(model, buildingFn);
diff --git a/src/lib/generated/builders/any-event-consumption-strategy-builder.ts b/src/lib/generated/builders/any-event-consumption-strategy-builder.ts
new file mode 100644
index 00000000..5bacba31
--- /dev/null
+++ b/src/lib/generated/builders/any-event-consumption-strategy-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { AnyEventConsumptionStrategyIntersection } from '../classes/any-event-consumption-strategy';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.AnyEventConsumptionStrategy} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {AnyEventConsumptionStrategyIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.AnyEventConsumptionStrategy,
+  options: BuildOptions,
+): AnyEventConsumptionStrategyIntersection {
+  const instance = new Classes.AnyEventConsumptionStrategy(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as AnyEventConsumptionStrategyIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `AnyEventConsumptionStrategyIntersection`
+ * @returns {Builder} A builder for `AnyEventConsumptionStrategyIntersection`
+ */
+export const anyEventConsumptionStrategyBuilder = (
+  model?: Partial,
+): Builder, AnyEventConsumptionStrategyIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/any-event-consumption-strategy-configuration-builder.ts b/src/lib/generated/builders/any-event-consumption-strategy-configuration-builder.ts
new file mode 100644
index 00000000..c8a9c7e5
--- /dev/null
+++ b/src/lib/generated/builders/any-event-consumption-strategy-configuration-builder.ts
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { arrayBuilder, ArrayBuilder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { AnyEventConsumptionStrategyConfigurationIntersection } from '../classes/any-event-consumption-strategy-configuration';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying array
+ * @param {Specification.AnyEventConsumptionStrategyConfiguration} model The proxied array
+ * @param {BuildOptions} options The build options to use
+ * @returns {AnyEventConsumptionStrategyConfigurationIntersection} The built array
+ */
+function buildingFn(
+  model: Specification.AnyEventConsumptionStrategyConfiguration,
+  options: BuildOptions,
+): AnyEventConsumptionStrategyConfigurationIntersection {
+  const instance = new Classes.AnyEventConsumptionStrategyConfiguration(model);
+  if (options.validate) instance.validate();
+  return (options.normalize
+    ? instance.normalize()
+    : instance) as unknown as AnyEventConsumptionStrategyConfigurationIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `AnyEventConsumptionStrategyConfigurationIntersection`
+ * @returns {ArrayBuilder} A builder for `AnyEventConsumptionStrategyConfigurationIntersection`
+ */
+export const anyEventConsumptionStrategyConfigurationBuilder = (
+  model?: Specification.AnyEventConsumptionStrategyConfiguration,
+): ArrayBuilder =>
+  arrayBuilder(model, buildingFn);
diff --git a/src/lib/generated/builders/any-event-consumption-strategy-until-builder.ts b/src/lib/generated/builders/any-event-consumption-strategy-until-builder.ts
new file mode 100644
index 00000000..dbdf9e5d
--- /dev/null
+++ b/src/lib/generated/builders/any-event-consumption-strategy-until-builder.ts
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { AnyEventConsumptionStrategyUntilIntersection } from '../classes/any-event-consumption-strategy-until';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.AnyEventConsumptionStrategyUntil} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {AnyEventConsumptionStrategyUntilIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.AnyEventConsumptionStrategyUntil,
+  options: BuildOptions,
+): AnyEventConsumptionStrategyUntilIntersection {
+  const instance = new Classes.AnyEventConsumptionStrategyUntil(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as AnyEventConsumptionStrategyUntilIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `AnyEventConsumptionStrategyUntilIntersection`
+ * @returns {Builder} A builder for `AnyEventConsumptionStrategyUntilIntersection`
+ */
+export const anyEventConsumptionStrategyUntilBuilder = (
+  model?: Partial,
+): Builder, AnyEventConsumptionStrategyUntilIntersection> =>
+  builder(
+    model,
+    buildingFn,
+  );
diff --git a/src/lib/generated/builders/any-event-until-consumed-builder.ts b/src/lib/generated/builders/any-event-until-consumed-builder.ts
new file mode 100644
index 00000000..1af840df
--- /dev/null
+++ b/src/lib/generated/builders/any-event-until-consumed-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { AnyEventUntilConsumedIntersection } from '../classes/any-event-until-consumed';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.AnyEventUntilConsumed} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {AnyEventUntilConsumedIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.AnyEventUntilConsumed,
+  options: BuildOptions,
+): AnyEventUntilConsumedIntersection {
+  const instance = new Classes.AnyEventUntilConsumed(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as AnyEventUntilConsumedIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `AnyEventUntilConsumedIntersection`
+ * @returns {Builder} A builder for `AnyEventUntilConsumedIntersection`
+ */
+export const anyEventUntilConsumedBuilder = (
+  model?: Partial,
+): Builder, AnyEventUntilConsumedIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/async-api-arguments-builder.ts b/src/lib/generated/builders/async-api-arguments-builder.ts
new file mode 100644
index 00000000..4ac9ed7a
--- /dev/null
+++ b/src/lib/generated/builders/async-api-arguments-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { AsyncApiArgumentsIntersection } from '../classes/async-api-arguments';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.AsyncApiArguments} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {AsyncApiArgumentsIntersection} The built object
+ */
+function buildingFn(model: Specification.AsyncApiArguments, options: BuildOptions): AsyncApiArgumentsIntersection {
+  const instance = new Classes.AsyncApiArguments(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as AsyncApiArgumentsIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `AsyncApiArgumentsIntersection`
+ * @returns {Builder} A builder for `AsyncApiArgumentsIntersection`
+ */
+export const asyncApiArgumentsBuilder = (
+  model?: Partial,
+): Builder, AsyncApiArgumentsIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/authentication-policy-builder.ts b/src/lib/generated/builders/authentication-policy-builder.ts
new file mode 100644
index 00000000..1acf09a8
--- /dev/null
+++ b/src/lib/generated/builders/authentication-policy-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { AuthenticationPolicyIntersection } from '../classes/authentication-policy';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.AuthenticationPolicy} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {AuthenticationPolicyIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.AuthenticationPolicy,
+  options: BuildOptions,
+): AuthenticationPolicyIntersection {
+  const instance = new Classes.AuthenticationPolicy(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as AuthenticationPolicyIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `AuthenticationPolicyIntersection`
+ * @returns {Builder} A builder for `AuthenticationPolicyIntersection`
+ */
+export const authenticationPolicyBuilder = (
+  model?: Partial,
+): Builder, AuthenticationPolicyIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/authentication-policy-reference-builder.ts b/src/lib/generated/builders/authentication-policy-reference-builder.ts
new file mode 100644
index 00000000..89a7d494
--- /dev/null
+++ b/src/lib/generated/builders/authentication-policy-reference-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { AuthenticationPolicyReferenceIntersection } from '../classes/authentication-policy-reference';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.AuthenticationPolicyReference} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {AuthenticationPolicyReferenceIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.AuthenticationPolicyReference,
+  options: BuildOptions,
+): AuthenticationPolicyReferenceIntersection {
+  const instance = new Classes.AuthenticationPolicyReference(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as AuthenticationPolicyReferenceIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `AuthenticationPolicyReferenceIntersection`
+ * @returns {Builder} A builder for `AuthenticationPolicyReferenceIntersection`
+ */
+export const authenticationPolicyReferenceBuilder = (
+  model?: Partial,
+): Builder, AuthenticationPolicyReferenceIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/basic-authentication-policy-builder.ts b/src/lib/generated/builders/basic-authentication-policy-builder.ts
new file mode 100644
index 00000000..ad168c7c
--- /dev/null
+++ b/src/lib/generated/builders/basic-authentication-policy-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { BasicAuthenticationPolicyIntersection } from '../classes/basic-authentication-policy';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.BasicAuthenticationPolicy} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {BasicAuthenticationPolicyIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.BasicAuthenticationPolicy,
+  options: BuildOptions,
+): BasicAuthenticationPolicyIntersection {
+  const instance = new Classes.BasicAuthenticationPolicy(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as BasicAuthenticationPolicyIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `BasicAuthenticationPolicyIntersection`
+ * @returns {Builder} A builder for `BasicAuthenticationPolicyIntersection`
+ */
+export const basicAuthenticationPolicyBuilder = (
+  model?: Partial,
+): Builder, BasicAuthenticationPolicyIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/basic-authentication-policy-configuration-builder.ts b/src/lib/generated/builders/basic-authentication-policy-configuration-builder.ts
new file mode 100644
index 00000000..cb8dc695
--- /dev/null
+++ b/src/lib/generated/builders/basic-authentication-policy-configuration-builder.ts
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { BasicAuthenticationPolicyConfigurationIntersection } from '../classes/basic-authentication-policy-configuration';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.BasicAuthenticationPolicyConfiguration} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {BasicAuthenticationPolicyConfigurationIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.BasicAuthenticationPolicyConfiguration,
+  options: BuildOptions,
+): BasicAuthenticationPolicyConfigurationIntersection {
+  const instance = new Classes.BasicAuthenticationPolicyConfiguration(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as BasicAuthenticationPolicyConfigurationIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `BasicAuthenticationPolicyConfigurationIntersection`
+ * @returns {Builder} A builder for `BasicAuthenticationPolicyConfigurationIntersection`
+ */
+export const basicAuthenticationPolicyConfigurationBuilder = (
+  model?: Partial,
+): Builder<
+  Partial,
+  BasicAuthenticationPolicyConfigurationIntersection
+> =>
+  builder(
+    model,
+    buildingFn,
+  );
diff --git a/src/lib/generated/builders/basic-authentication-properties-builder.ts b/src/lib/generated/builders/basic-authentication-properties-builder.ts
new file mode 100644
index 00000000..5ad97b19
--- /dev/null
+++ b/src/lib/generated/builders/basic-authentication-properties-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { BasicAuthenticationPropertiesIntersection } from '../classes/basic-authentication-properties';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.BasicAuthenticationProperties} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {BasicAuthenticationPropertiesIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.BasicAuthenticationProperties,
+  options: BuildOptions,
+): BasicAuthenticationPropertiesIntersection {
+  const instance = new Classes.BasicAuthenticationProperties(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as BasicAuthenticationPropertiesIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `BasicAuthenticationPropertiesIntersection`
+ * @returns {Builder} A builder for `BasicAuthenticationPropertiesIntersection`
+ */
+export const basicAuthenticationPropertiesBuilder = (
+  model?: Partial,
+): Builder, BasicAuthenticationPropertiesIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/bearer-authentication-policy-builder.ts b/src/lib/generated/builders/bearer-authentication-policy-builder.ts
new file mode 100644
index 00000000..491270ed
--- /dev/null
+++ b/src/lib/generated/builders/bearer-authentication-policy-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { BearerAuthenticationPolicyIntersection } from '../classes/bearer-authentication-policy';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.BearerAuthenticationPolicy} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {BearerAuthenticationPolicyIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.BearerAuthenticationPolicy,
+  options: BuildOptions,
+): BearerAuthenticationPolicyIntersection {
+  const instance = new Classes.BearerAuthenticationPolicy(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as BearerAuthenticationPolicyIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `BearerAuthenticationPolicyIntersection`
+ * @returns {Builder} A builder for `BearerAuthenticationPolicyIntersection`
+ */
+export const bearerAuthenticationPolicyBuilder = (
+  model?: Partial,
+): Builder, BearerAuthenticationPolicyIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/bearer-authentication-policy-configuration-builder.ts b/src/lib/generated/builders/bearer-authentication-policy-configuration-builder.ts
new file mode 100644
index 00000000..e6f76012
--- /dev/null
+++ b/src/lib/generated/builders/bearer-authentication-policy-configuration-builder.ts
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { BearerAuthenticationPolicyConfigurationIntersection } from '../classes/bearer-authentication-policy-configuration';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.BearerAuthenticationPolicyConfiguration} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {BearerAuthenticationPolicyConfigurationIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.BearerAuthenticationPolicyConfiguration,
+  options: BuildOptions,
+): BearerAuthenticationPolicyConfigurationIntersection {
+  const instance = new Classes.BearerAuthenticationPolicyConfiguration(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as BearerAuthenticationPolicyConfigurationIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `BearerAuthenticationPolicyConfigurationIntersection`
+ * @returns {Builder} A builder for `BearerAuthenticationPolicyConfigurationIntersection`
+ */
+export const bearerAuthenticationPolicyConfigurationBuilder = (
+  model?: Partial,
+): Builder<
+  Partial,
+  BearerAuthenticationPolicyConfigurationIntersection
+> =>
+  builder(
+    model,
+    buildingFn,
+  );
diff --git a/src/lib/generated/builders/bearer-authentication-properties-builder.ts b/src/lib/generated/builders/bearer-authentication-properties-builder.ts
new file mode 100644
index 00000000..21fb44d5
--- /dev/null
+++ b/src/lib/generated/builders/bearer-authentication-properties-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { BearerAuthenticationPropertiesIntersection } from '../classes/bearer-authentication-properties';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.BearerAuthenticationProperties} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {BearerAuthenticationPropertiesIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.BearerAuthenticationProperties,
+  options: BuildOptions,
+): BearerAuthenticationPropertiesIntersection {
+  const instance = new Classes.BearerAuthenticationProperties(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as BearerAuthenticationPropertiesIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `BearerAuthenticationPropertiesIntersection`
+ * @returns {Builder} A builder for `BearerAuthenticationPropertiesIntersection`
+ */
+export const bearerAuthenticationPropertiesBuilder = (
+  model?: Partial,
+): Builder, BearerAuthenticationPropertiesIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/call-async-api-builder.ts b/src/lib/generated/builders/call-async-api-builder.ts
new file mode 100644
index 00000000..07fdc9f5
--- /dev/null
+++ b/src/lib/generated/builders/call-async-api-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { CallAsyncAPIIntersection } from '../classes/call-async-api';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.CallAsyncAPI} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {CallAsyncAPIIntersection} The built object
+ */
+function buildingFn(model: Specification.CallAsyncAPI, options: BuildOptions): CallAsyncAPIIntersection {
+  const instance = new Classes.CallAsyncAPI(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as CallAsyncAPIIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `CallAsyncAPIIntersection`
+ * @returns {Builder} A builder for `CallAsyncAPIIntersection`
+ */
+export const callAsyncAPIBuilder = (
+  model?: Partial,
+): Builder, CallAsyncAPIIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/call-function-builder.ts b/src/lib/generated/builders/call-function-builder.ts
new file mode 100644
index 00000000..ca729edc
--- /dev/null
+++ b/src/lib/generated/builders/call-function-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { CallFunctionIntersection } from '../classes/call-function';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.CallFunction} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {CallFunctionIntersection} The built object
+ */
+function buildingFn(model: Specification.CallFunction, options: BuildOptions): CallFunctionIntersection {
+  const instance = new Classes.CallFunction(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as CallFunctionIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `CallFunctionIntersection`
+ * @returns {Builder} A builder for `CallFunctionIntersection`
+ */
+export const callFunctionBuilder = (
+  model?: Partial,
+): Builder, CallFunctionIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/call-grpc-builder.ts b/src/lib/generated/builders/call-grpc-builder.ts
new file mode 100644
index 00000000..356e3d64
--- /dev/null
+++ b/src/lib/generated/builders/call-grpc-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { CallGRPCIntersection } from '../classes/call-grpc';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.CallGRPC} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {CallGRPCIntersection} The built object
+ */
+function buildingFn(model: Specification.CallGRPC, options: BuildOptions): CallGRPCIntersection {
+  const instance = new Classes.CallGRPC(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as CallGRPCIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `CallGRPCIntersection`
+ * @returns {Builder} A builder for `CallGRPCIntersection`
+ */
+export const callGRPCBuilder = (
+  model?: Partial,
+): Builder, CallGRPCIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/call-http-builder.ts b/src/lib/generated/builders/call-http-builder.ts
new file mode 100644
index 00000000..e6ac20c8
--- /dev/null
+++ b/src/lib/generated/builders/call-http-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { CallHTTPIntersection } from '../classes/call-http';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.CallHTTP} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {CallHTTPIntersection} The built object
+ */
+function buildingFn(model: Specification.CallHTTP, options: BuildOptions): CallHTTPIntersection {
+  const instance = new Classes.CallHTTP(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as CallHTTPIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `CallHTTPIntersection`
+ * @returns {Builder} A builder for `CallHTTPIntersection`
+ */
+export const callHTTPBuilder = (
+  model?: Partial,
+): Builder, CallHTTPIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/call-open-api-builder.ts b/src/lib/generated/builders/call-open-api-builder.ts
new file mode 100644
index 00000000..98c8d11e
--- /dev/null
+++ b/src/lib/generated/builders/call-open-api-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { CallOpenAPIIntersection } from '../classes/call-open-api';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.CallOpenAPI} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {CallOpenAPIIntersection} The built object
+ */
+function buildingFn(model: Specification.CallOpenAPI, options: BuildOptions): CallOpenAPIIntersection {
+  const instance = new Classes.CallOpenAPI(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as CallOpenAPIIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `CallOpenAPIIntersection`
+ * @returns {Builder} A builder for `CallOpenAPIIntersection`
+ */
+export const callOpenAPIBuilder = (
+  model?: Partial,
+): Builder, CallOpenAPIIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/call-task-builder.ts b/src/lib/generated/builders/call-task-builder.ts
new file mode 100644
index 00000000..5015eb16
--- /dev/null
+++ b/src/lib/generated/builders/call-task-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { CallTaskIntersection } from '../classes/call-task';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.CallTask} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {CallTaskIntersection} The built object
+ */
+function buildingFn(model: Specification.CallTask, options: BuildOptions): CallTaskIntersection {
+  const instance = new Classes.CallTask(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as CallTaskIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `CallTaskIntersection`
+ * @returns {Builder} A builder for `CallTaskIntersection`
+ */
+export const callTaskBuilder = (
+  model?: Partial,
+): Builder, CallTaskIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/catalog-builder.ts b/src/lib/generated/builders/catalog-builder.ts
new file mode 100644
index 00000000..96f0ee20
--- /dev/null
+++ b/src/lib/generated/builders/catalog-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { CatalogIntersection } from '../classes/catalog';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.Catalog} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {CatalogIntersection} The built object
+ */
+function buildingFn(model: Specification.Catalog, options: BuildOptions): CatalogIntersection {
+  const instance = new Classes.Catalog(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as CatalogIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `CatalogIntersection`
+ * @returns {Builder} A builder for `CatalogIntersection`
+ */
+export const catalogBuilder = (
+  model?: Partial,
+): Builder, CatalogIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/catch-errors-builder.ts b/src/lib/generated/builders/catch-errors-builder.ts
new file mode 100644
index 00000000..ad6aad55
--- /dev/null
+++ b/src/lib/generated/builders/catch-errors-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { CatchErrorsIntersection } from '../classes/catch-errors';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.CatchErrors} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {CatchErrorsIntersection} The built object
+ */
+function buildingFn(model: Specification.CatchErrors, options: BuildOptions): CatchErrorsIntersection {
+  const instance = new Classes.CatchErrors(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as CatchErrorsIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `CatchErrorsIntersection`
+ * @returns {Builder} A builder for `CatchErrorsIntersection`
+ */
+export const catchErrorsBuilder = (
+  model?: Partial,
+): Builder, CatchErrorsIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/constant-backoff-builder.ts b/src/lib/generated/builders/constant-backoff-builder.ts
new file mode 100644
index 00000000..5abb9720
--- /dev/null
+++ b/src/lib/generated/builders/constant-backoff-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ConstantBackoffIntersection } from '../classes/constant-backoff';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ConstantBackoff} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ConstantBackoffIntersection} The built object
+ */
+function buildingFn(model: Specification.ConstantBackoff, options: BuildOptions): ConstantBackoffIntersection {
+  const instance = new Classes.ConstantBackoff(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ConstantBackoffIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ConstantBackoffIntersection`
+ * @returns {Builder} A builder for `ConstantBackoffIntersection`
+ */
+export const constantBackoffBuilder = (
+  model?: Partial,
+): Builder, ConstantBackoffIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/container-builder.ts b/src/lib/generated/builders/container-builder.ts
new file mode 100644
index 00000000..6396a982
--- /dev/null
+++ b/src/lib/generated/builders/container-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ContainerIntersection } from '../classes/container';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.Container} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ContainerIntersection} The built object
+ */
+function buildingFn(model: Specification.Container, options: BuildOptions): ContainerIntersection {
+  const instance = new Classes.Container(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ContainerIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ContainerIntersection`
+ * @returns {Builder} A builder for `ContainerIntersection`
+ */
+export const containerBuilder = (
+  model?: Partial,
+): Builder, ContainerIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/container-environment-builder.ts b/src/lib/generated/builders/container-environment-builder.ts
new file mode 100644
index 00000000..f6a19fcc
--- /dev/null
+++ b/src/lib/generated/builders/container-environment-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ContainerEnvironmentIntersection } from '../classes/container-environment';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ContainerEnvironment} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ContainerEnvironmentIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.ContainerEnvironment,
+  options: BuildOptions,
+): ContainerEnvironmentIntersection {
+  const instance = new Classes.ContainerEnvironment(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ContainerEnvironmentIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ContainerEnvironmentIntersection`
+ * @returns {Builder} A builder for `ContainerEnvironmentIntersection`
+ */
+export const containerEnvironmentBuilder = (
+  model?: Partial,
+): Builder, ContainerEnvironmentIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/container-lifetime-builder.ts b/src/lib/generated/builders/container-lifetime-builder.ts
new file mode 100644
index 00000000..b1bf0f8b
--- /dev/null
+++ b/src/lib/generated/builders/container-lifetime-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ContainerLifetimeIntersection } from '../classes/container-lifetime';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ContainerLifetime} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ContainerLifetimeIntersection} The built object
+ */
+function buildingFn(model: Specification.ContainerLifetime, options: BuildOptions): ContainerLifetimeIntersection {
+  const instance = new Classes.ContainerLifetime(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ContainerLifetimeIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ContainerLifetimeIntersection`
+ * @returns {Builder} A builder for `ContainerLifetimeIntersection`
+ */
+export const containerLifetimeBuilder = (
+  model?: Partial,
+): Builder, ContainerLifetimeIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/container-ports-builder.ts b/src/lib/generated/builders/container-ports-builder.ts
new file mode 100644
index 00000000..1f45f71e
--- /dev/null
+++ b/src/lib/generated/builders/container-ports-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ContainerPortsIntersection } from '../classes/container-ports';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ContainerPorts} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ContainerPortsIntersection} The built object
+ */
+function buildingFn(model: Specification.ContainerPorts, options: BuildOptions): ContainerPortsIntersection {
+  const instance = new Classes.ContainerPorts(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ContainerPortsIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ContainerPortsIntersection`
+ * @returns {Builder} A builder for `ContainerPortsIntersection`
+ */
+export const containerPortsBuilder = (
+  model?: Partial,
+): Builder, ContainerPortsIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/container-volumes-builder.ts b/src/lib/generated/builders/container-volumes-builder.ts
new file mode 100644
index 00000000..eb438acd
--- /dev/null
+++ b/src/lib/generated/builders/container-volumes-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ContainerVolumesIntersection } from '../classes/container-volumes';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ContainerVolumes} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ContainerVolumesIntersection} The built object
+ */
+function buildingFn(model: Specification.ContainerVolumes, options: BuildOptions): ContainerVolumesIntersection {
+  const instance = new Classes.ContainerVolumes(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ContainerVolumesIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ContainerVolumesIntersection`
+ * @returns {Builder} A builder for `ContainerVolumesIntersection`
+ */
+export const containerVolumesBuilder = (
+  model?: Partial,
+): Builder, ContainerVolumesIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/digest-authentication-policy-builder.ts b/src/lib/generated/builders/digest-authentication-policy-builder.ts
new file mode 100644
index 00000000..c3e01db2
--- /dev/null
+++ b/src/lib/generated/builders/digest-authentication-policy-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { DigestAuthenticationPolicyIntersection } from '../classes/digest-authentication-policy';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.DigestAuthenticationPolicy} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {DigestAuthenticationPolicyIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.DigestAuthenticationPolicy,
+  options: BuildOptions,
+): DigestAuthenticationPolicyIntersection {
+  const instance = new Classes.DigestAuthenticationPolicy(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as DigestAuthenticationPolicyIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `DigestAuthenticationPolicyIntersection`
+ * @returns {Builder} A builder for `DigestAuthenticationPolicyIntersection`
+ */
+export const digestAuthenticationPolicyBuilder = (
+  model?: Partial,
+): Builder, DigestAuthenticationPolicyIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/digest-authentication-policy-configuration-builder.ts b/src/lib/generated/builders/digest-authentication-policy-configuration-builder.ts
new file mode 100644
index 00000000..2aef95af
--- /dev/null
+++ b/src/lib/generated/builders/digest-authentication-policy-configuration-builder.ts
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { DigestAuthenticationPolicyConfigurationIntersection } from '../classes/digest-authentication-policy-configuration';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.DigestAuthenticationPolicyConfiguration} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {DigestAuthenticationPolicyConfigurationIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.DigestAuthenticationPolicyConfiguration,
+  options: BuildOptions,
+): DigestAuthenticationPolicyConfigurationIntersection {
+  const instance = new Classes.DigestAuthenticationPolicyConfiguration(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as DigestAuthenticationPolicyConfigurationIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `DigestAuthenticationPolicyConfigurationIntersection`
+ * @returns {Builder} A builder for `DigestAuthenticationPolicyConfigurationIntersection`
+ */
+export const digestAuthenticationPolicyConfigurationBuilder = (
+  model?: Partial,
+): Builder<
+  Partial,
+  DigestAuthenticationPolicyConfigurationIntersection
+> =>
+  builder(
+    model,
+    buildingFn,
+  );
diff --git a/src/lib/generated/builders/digest-authentication-properties-builder.ts b/src/lib/generated/builders/digest-authentication-properties-builder.ts
new file mode 100644
index 00000000..a7d2a1cd
--- /dev/null
+++ b/src/lib/generated/builders/digest-authentication-properties-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { DigestAuthenticationPropertiesIntersection } from '../classes/digest-authentication-properties';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.DigestAuthenticationProperties} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {DigestAuthenticationPropertiesIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.DigestAuthenticationProperties,
+  options: BuildOptions,
+): DigestAuthenticationPropertiesIntersection {
+  const instance = new Classes.DigestAuthenticationProperties(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as DigestAuthenticationPropertiesIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `DigestAuthenticationPropertiesIntersection`
+ * @returns {Builder} A builder for `DigestAuthenticationPropertiesIntersection`
+ */
+export const digestAuthenticationPropertiesBuilder = (
+  model?: Partial,
+): Builder, DigestAuthenticationPropertiesIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/do-task-builder.ts b/src/lib/generated/builders/do-task-builder.ts
new file mode 100644
index 00000000..baaf1331
--- /dev/null
+++ b/src/lib/generated/builders/do-task-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { DoTaskIntersection } from '../classes/do-task';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.DoTask} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {DoTaskIntersection} The built object
+ */
+function buildingFn(model: Specification.DoTask, options: BuildOptions): DoTaskIntersection {
+  const instance = new Classes.DoTask(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as DoTaskIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `DoTaskIntersection`
+ * @returns {Builder} A builder for `DoTaskIntersection`
+ */
+export const doTaskBuilder = (
+  model?: Partial,
+): Builder, DoTaskIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/document-builder.ts b/src/lib/generated/builders/document-builder.ts
new file mode 100644
index 00000000..f8eb93a5
--- /dev/null
+++ b/src/lib/generated/builders/document-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { DocumentIntersection } from '../classes/document';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.Document} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {DocumentIntersection} The built object
+ */
+function buildingFn(model: Specification.Document, options: BuildOptions): DocumentIntersection {
+  const instance = new Classes.Document(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as DocumentIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `DocumentIntersection`
+ * @returns {Builder} A builder for `DocumentIntersection`
+ */
+export const documentBuilder = (
+  model?: Partial,
+): Builder, DocumentIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/duration-builder.ts b/src/lib/generated/builders/duration-builder.ts
new file mode 100644
index 00000000..87bfaea0
--- /dev/null
+++ b/src/lib/generated/builders/duration-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { DurationIntersection } from '../classes/duration';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.Duration} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {DurationIntersection} The built object
+ */
+function buildingFn(model: Specification.Duration, options: BuildOptions): DurationIntersection {
+  const instance = new Classes.Duration(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as DurationIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `DurationIntersection`
+ * @returns {Builder} A builder for `DurationIntersection`
+ */
+export const durationBuilder = (
+  model?: Partial,
+): Builder, DurationIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/duration-inline-builder.ts b/src/lib/generated/builders/duration-inline-builder.ts
new file mode 100644
index 00000000..15aa68e8
--- /dev/null
+++ b/src/lib/generated/builders/duration-inline-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { DurationInlineIntersection } from '../classes/duration-inline';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.DurationInline} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {DurationInlineIntersection} The built object
+ */
+function buildingFn(model: Specification.DurationInline, options: BuildOptions): DurationInlineIntersection {
+  const instance = new Classes.DurationInline(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as DurationInlineIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `DurationInlineIntersection`
+ * @returns {Builder} A builder for `DurationInlineIntersection`
+ */
+export const durationInlineBuilder = (
+  model?: Partial,
+): Builder, DurationInlineIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/emit-event-definition-builder.ts b/src/lib/generated/builders/emit-event-definition-builder.ts
new file mode 100644
index 00000000..f89df72c
--- /dev/null
+++ b/src/lib/generated/builders/emit-event-definition-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { EmitEventDefinitionIntersection } from '../classes/emit-event-definition';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.EmitEventDefinition} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {EmitEventDefinitionIntersection} The built object
+ */
+function buildingFn(model: Specification.EmitEventDefinition, options: BuildOptions): EmitEventDefinitionIntersection {
+  const instance = new Classes.EmitEventDefinition(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as EmitEventDefinitionIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `EmitEventDefinitionIntersection`
+ * @returns {Builder} A builder for `EmitEventDefinitionIntersection`
+ */
+export const emitEventDefinitionBuilder = (
+  model?: Partial,
+): Builder, EmitEventDefinitionIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/emit-event-with-builder.ts b/src/lib/generated/builders/emit-event-with-builder.ts
new file mode 100644
index 00000000..d96e5f7d
--- /dev/null
+++ b/src/lib/generated/builders/emit-event-with-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { EmitEventWithIntersection } from '../classes/emit-event-with';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.EmitEventWith} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {EmitEventWithIntersection} The built object
+ */
+function buildingFn(model: Specification.EmitEventWith, options: BuildOptions): EmitEventWithIntersection {
+  const instance = new Classes.EmitEventWith(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as EmitEventWithIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `EmitEventWithIntersection`
+ * @returns {Builder} A builder for `EmitEventWithIntersection`
+ */
+export const emitEventWithBuilder = (
+  model?: Partial,
+): Builder, EmitEventWithIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/emit-task-builder.ts b/src/lib/generated/builders/emit-task-builder.ts
new file mode 100644
index 00000000..60313474
--- /dev/null
+++ b/src/lib/generated/builders/emit-task-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { EmitTaskIntersection } from '../classes/emit-task';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.EmitTask} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {EmitTaskIntersection} The built object
+ */
+function buildingFn(model: Specification.EmitTask, options: BuildOptions): EmitTaskIntersection {
+  const instance = new Classes.EmitTask(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as EmitTaskIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `EmitTaskIntersection`
+ * @returns {Builder} A builder for `EmitTaskIntersection`
+ */
+export const emitTaskBuilder = (
+  model?: Partial,
+): Builder, EmitTaskIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/emit-task-configuration-builder.ts b/src/lib/generated/builders/emit-task-configuration-builder.ts
new file mode 100644
index 00000000..715fba1e
--- /dev/null
+++ b/src/lib/generated/builders/emit-task-configuration-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { EmitTaskConfigurationIntersection } from '../classes/emit-task-configuration';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.EmitTaskConfiguration} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {EmitTaskConfigurationIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.EmitTaskConfiguration,
+  options: BuildOptions,
+): EmitTaskConfigurationIntersection {
+  const instance = new Classes.EmitTaskConfiguration(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as EmitTaskConfigurationIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `EmitTaskConfigurationIntersection`
+ * @returns {Builder} A builder for `EmitTaskConfigurationIntersection`
+ */
+export const emitTaskConfigurationBuilder = (
+  model?: Partial,
+): Builder, EmitTaskConfigurationIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/endpoint-builder.ts b/src/lib/generated/builders/endpoint-builder.ts
new file mode 100644
index 00000000..0c397ee8
--- /dev/null
+++ b/src/lib/generated/builders/endpoint-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { EndpointIntersection } from '../classes/endpoint';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.Endpoint} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {EndpointIntersection} The built object
+ */
+function buildingFn(model: Specification.Endpoint, options: BuildOptions): EndpointIntersection {
+  const instance = new Classes.Endpoint(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as EndpointIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `EndpointIntersection`
+ * @returns {Builder} A builder for `EndpointIntersection`
+ */
+export const endpointBuilder = (
+  model?: Partial,
+): Builder, EndpointIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/endpoint-configuration-builder.ts b/src/lib/generated/builders/endpoint-configuration-builder.ts
new file mode 100644
index 00000000..11fb85cc
--- /dev/null
+++ b/src/lib/generated/builders/endpoint-configuration-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { EndpointConfigurationIntersection } from '../classes/endpoint-configuration';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.EndpointConfiguration} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {EndpointConfigurationIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.EndpointConfiguration,
+  options: BuildOptions,
+): EndpointConfigurationIntersection {
+  const instance = new Classes.EndpointConfiguration(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as EndpointConfigurationIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `EndpointConfigurationIntersection`
+ * @returns {Builder} A builder for `EndpointConfigurationIntersection`
+ */
+export const endpointConfigurationBuilder = (
+  model?: Partial,
+): Builder, EndpointConfigurationIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/endpoint-uri-builder.ts b/src/lib/generated/builders/endpoint-uri-builder.ts
new file mode 100644
index 00000000..3de7e83a
--- /dev/null
+++ b/src/lib/generated/builders/endpoint-uri-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { EndpointUriIntersection } from '../classes/endpoint-uri';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.EndpointUri} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {EndpointUriIntersection} The built object
+ */
+function buildingFn(model: Specification.EndpointUri, options: BuildOptions): EndpointUriIntersection {
+  const instance = new Classes.EndpointUri(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as EndpointUriIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `EndpointUriIntersection`
+ * @returns {Builder} A builder for `EndpointUriIntersection`
+ */
+export const endpointUriBuilder = (
+  model?: Partial,
+): Builder, EndpointUriIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/error-builder.ts b/src/lib/generated/builders/error-builder.ts
new file mode 100644
index 00000000..0c4e6e02
--- /dev/null
+++ b/src/lib/generated/builders/error-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ErrorIntersection } from '../classes/error';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.Error} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ErrorIntersection} The built object
+ */
+function buildingFn(model: Specification.Error, options: BuildOptions): ErrorIntersection {
+  const instance = new Classes.Error(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ErrorIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ErrorIntersection`
+ * @returns {Builder} A builder for `ErrorIntersection`
+ */
+export const errorBuilder = (
+  model?: Partial,
+): Builder, ErrorIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/error-filter-builder.ts b/src/lib/generated/builders/error-filter-builder.ts
new file mode 100644
index 00000000..a8c0558b
--- /dev/null
+++ b/src/lib/generated/builders/error-filter-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ErrorFilterIntersection } from '../classes/error-filter';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ErrorFilter} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ErrorFilterIntersection} The built object
+ */
+function buildingFn(model: Specification.ErrorFilter, options: BuildOptions): ErrorFilterIntersection {
+  const instance = new Classes.ErrorFilter(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ErrorFilterIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ErrorFilterIntersection`
+ * @returns {Builder} A builder for `ErrorFilterIntersection`
+ */
+export const errorFilterBuilder = (
+  model?: Partial,
+): Builder, ErrorFilterIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/error-instance-builder.ts b/src/lib/generated/builders/error-instance-builder.ts
new file mode 100644
index 00000000..d0bf62ed
--- /dev/null
+++ b/src/lib/generated/builders/error-instance-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ErrorInstanceIntersection } from '../classes/error-instance';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ErrorInstance} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ErrorInstanceIntersection} The built object
+ */
+function buildingFn(model: Specification.ErrorInstance, options: BuildOptions): ErrorInstanceIntersection {
+  const instance = new Classes.ErrorInstance(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ErrorInstanceIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ErrorInstanceIntersection`
+ * @returns {Builder} A builder for `ErrorInstanceIntersection`
+ */
+export const errorInstanceBuilder = (
+  model?: Partial,
+): Builder, ErrorInstanceIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/error-type-builder.ts b/src/lib/generated/builders/error-type-builder.ts
new file mode 100644
index 00000000..49b5d8cc
--- /dev/null
+++ b/src/lib/generated/builders/error-type-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ErrorTypeIntersection } from '../classes/error-type';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ErrorType} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ErrorTypeIntersection} The built object
+ */
+function buildingFn(model: Specification.ErrorType, options: BuildOptions): ErrorTypeIntersection {
+  const instance = new Classes.ErrorType(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ErrorTypeIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ErrorTypeIntersection`
+ * @returns {Builder} A builder for `ErrorTypeIntersection`
+ */
+export const errorTypeBuilder = (
+  model?: Partial,
+): Builder, ErrorTypeIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/event-consumption-strategy-builder.ts b/src/lib/generated/builders/event-consumption-strategy-builder.ts
new file mode 100644
index 00000000..94d9e939
--- /dev/null
+++ b/src/lib/generated/builders/event-consumption-strategy-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { EventConsumptionStrategyIntersection } from '../classes/event-consumption-strategy';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.EventConsumptionStrategy} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {EventConsumptionStrategyIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.EventConsumptionStrategy,
+  options: BuildOptions,
+): EventConsumptionStrategyIntersection {
+  const instance = new Classes.EventConsumptionStrategy(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as EventConsumptionStrategyIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `EventConsumptionStrategyIntersection`
+ * @returns {Builder} A builder for `EventConsumptionStrategyIntersection`
+ */
+export const eventConsumptionStrategyBuilder = (
+  model?: Partial,
+): Builder, EventConsumptionStrategyIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/event-data-builder.ts b/src/lib/generated/builders/event-data-builder.ts
new file mode 100644
index 00000000..92a8c96a
--- /dev/null
+++ b/src/lib/generated/builders/event-data-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { EventDataIntersection } from '../classes/event-data';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.EventData} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {EventDataIntersection} The built object
+ */
+function buildingFn(model: Specification.EventData, options: BuildOptions): EventDataIntersection {
+  const instance = new Classes.EventData(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as EventDataIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `EventDataIntersection`
+ * @returns {Builder} A builder for `EventDataIntersection`
+ */
+export const eventDataBuilder = (
+  model?: Partial,
+): Builder, EventDataIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/event-dataschema-builder.ts b/src/lib/generated/builders/event-dataschema-builder.ts
new file mode 100644
index 00000000..81436195
--- /dev/null
+++ b/src/lib/generated/builders/event-dataschema-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { EventDataschemaIntersection } from '../classes/event-dataschema';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.EventDataschema} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {EventDataschemaIntersection} The built object
+ */
+function buildingFn(model: Specification.EventDataschema, options: BuildOptions): EventDataschemaIntersection {
+  const instance = new Classes.EventDataschema(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as EventDataschemaIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `EventDataschemaIntersection`
+ * @returns {Builder} A builder for `EventDataschemaIntersection`
+ */
+export const eventDataschemaBuilder = (
+  model?: Partial,
+): Builder, EventDataschemaIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/event-filter-builder.ts b/src/lib/generated/builders/event-filter-builder.ts
new file mode 100644
index 00000000..d1c9c383
--- /dev/null
+++ b/src/lib/generated/builders/event-filter-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { EventFilterIntersection } from '../classes/event-filter';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.EventFilter} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {EventFilterIntersection} The built object
+ */
+function buildingFn(model: Specification.EventFilter, options: BuildOptions): EventFilterIntersection {
+  const instance = new Classes.EventFilter(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as EventFilterIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `EventFilterIntersection`
+ * @returns {Builder} A builder for `EventFilterIntersection`
+ */
+export const eventFilterBuilder = (
+  model?: Partial,
+): Builder, EventFilterIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/event-filter-correlate-builder.ts b/src/lib/generated/builders/event-filter-correlate-builder.ts
new file mode 100644
index 00000000..6fbafb61
--- /dev/null
+++ b/src/lib/generated/builders/event-filter-correlate-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { EventFilterCorrelateIntersection } from '../classes/event-filter-correlate';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.EventFilterCorrelate} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {EventFilterCorrelateIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.EventFilterCorrelate,
+  options: BuildOptions,
+): EventFilterCorrelateIntersection {
+  const instance = new Classes.EventFilterCorrelate(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as EventFilterCorrelateIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `EventFilterCorrelateIntersection`
+ * @returns {Builder} A builder for `EventFilterCorrelateIntersection`
+ */
+export const eventFilterCorrelateBuilder = (
+  model?: Partial,
+): Builder, EventFilterCorrelateIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/event-source-builder.ts b/src/lib/generated/builders/event-source-builder.ts
new file mode 100644
index 00000000..449b00ba
--- /dev/null
+++ b/src/lib/generated/builders/event-source-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { EventSourceIntersection } from '../classes/event-source';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.EventSource} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {EventSourceIntersection} The built object
+ */
+function buildingFn(model: Specification.EventSource, options: BuildOptions): EventSourceIntersection {
+  const instance = new Classes.EventSource(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as EventSourceIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `EventSourceIntersection`
+ * @returns {Builder} A builder for `EventSourceIntersection`
+ */
+export const eventSourceBuilder = (
+  model?: Partial,
+): Builder, EventSourceIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/event-time-builder.ts b/src/lib/generated/builders/event-time-builder.ts
new file mode 100644
index 00000000..b9499cb0
--- /dev/null
+++ b/src/lib/generated/builders/event-time-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { EventTimeIntersection } from '../classes/event-time';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.EventTime} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {EventTimeIntersection} The built object
+ */
+function buildingFn(model: Specification.EventTime, options: BuildOptions): EventTimeIntersection {
+  const instance = new Classes.EventTime(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as EventTimeIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `EventTimeIntersection`
+ * @returns {Builder} A builder for `EventTimeIntersection`
+ */
+export const eventTimeBuilder = (
+  model?: Partial,
+): Builder, EventTimeIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/exponential-back-off-builder.ts b/src/lib/generated/builders/exponential-back-off-builder.ts
new file mode 100644
index 00000000..df4d6bbb
--- /dev/null
+++ b/src/lib/generated/builders/exponential-back-off-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ExponentialBackOffIntersection } from '../classes/exponential-back-off';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ExponentialBackOff} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ExponentialBackOffIntersection} The built object
+ */
+function buildingFn(model: Specification.ExponentialBackOff, options: BuildOptions): ExponentialBackOffIntersection {
+  const instance = new Classes.ExponentialBackOff(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ExponentialBackOffIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ExponentialBackOffIntersection`
+ * @returns {Builder} A builder for `ExponentialBackOffIntersection`
+ */
+export const exponentialBackOffBuilder = (
+  model?: Partial,
+): Builder, ExponentialBackOffIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/export-as-builder.ts b/src/lib/generated/builders/export-as-builder.ts
new file mode 100644
index 00000000..e09e270f
--- /dev/null
+++ b/src/lib/generated/builders/export-as-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ExportAsIntersection } from '../classes/export-as';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ExportAs} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ExportAsIntersection} The built object
+ */
+function buildingFn(model: Specification.ExportAs, options: BuildOptions): ExportAsIntersection {
+  const instance = new Classes.ExportAs(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ExportAsIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ExportAsIntersection`
+ * @returns {Builder} A builder for `ExportAsIntersection`
+ */
+export const exportAsBuilder = (
+  model?: Partial,
+): Builder, ExportAsIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/export-builder.ts b/src/lib/generated/builders/export-builder.ts
new file mode 100644
index 00000000..c7255e64
--- /dev/null
+++ b/src/lib/generated/builders/export-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ExportIntersection } from '../classes/export';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.Export} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ExportIntersection} The built object
+ */
+function buildingFn(model: Specification.Export, options: BuildOptions): ExportIntersection {
+  const instance = new Classes.Export(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ExportIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ExportIntersection`
+ * @returns {Builder} A builder for `ExportIntersection`
+ */
+export const exportBuilder = (
+  model?: Partial,
+): Builder, ExportIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/extension-builder.ts b/src/lib/generated/builders/extension-builder.ts
new file mode 100644
index 00000000..f9f0b71c
--- /dev/null
+++ b/src/lib/generated/builders/extension-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ExtensionIntersection } from '../classes/extension';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.Extension} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ExtensionIntersection} The built object
+ */
+function buildingFn(model: Specification.Extension, options: BuildOptions): ExtensionIntersection {
+  const instance = new Classes.Extension(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ExtensionIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ExtensionIntersection`
+ * @returns {Builder} A builder for `ExtensionIntersection`
+ */
+export const extensionBuilder = (
+  model?: Partial,
+): Builder, ExtensionIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/extension-item-builder.ts b/src/lib/generated/builders/extension-item-builder.ts
new file mode 100644
index 00000000..d99c7194
--- /dev/null
+++ b/src/lib/generated/builders/extension-item-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ExtensionItemIntersection } from '../classes/extension-item';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ExtensionItem} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ExtensionItemIntersection} The built object
+ */
+function buildingFn(model: Specification.ExtensionItem, options: BuildOptions): ExtensionItemIntersection {
+  const instance = new Classes.ExtensionItem(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ExtensionItemIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ExtensionItemIntersection`
+ * @returns {Builder} A builder for `ExtensionItemIntersection`
+ */
+export const extensionItemBuilder = (
+  model?: Partial,
+): Builder, ExtensionItemIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/external-resource-builder.ts b/src/lib/generated/builders/external-resource-builder.ts
new file mode 100644
index 00000000..d03ae38d
--- /dev/null
+++ b/src/lib/generated/builders/external-resource-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ExternalResourceIntersection } from '../classes/external-resource';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ExternalResource} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ExternalResourceIntersection} The built object
+ */
+function buildingFn(model: Specification.ExternalResource, options: BuildOptions): ExternalResourceIntersection {
+  const instance = new Classes.ExternalResource(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ExternalResourceIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ExternalResourceIntersection`
+ * @returns {Builder} A builder for `ExternalResourceIntersection`
+ */
+export const externalResourceBuilder = (
+  model?: Partial,
+): Builder, ExternalResourceIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/external-script-builder.ts b/src/lib/generated/builders/external-script-builder.ts
new file mode 100644
index 00000000..6e5f29e1
--- /dev/null
+++ b/src/lib/generated/builders/external-script-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ExternalScriptIntersection } from '../classes/external-script';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ExternalScript} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ExternalScriptIntersection} The built object
+ */
+function buildingFn(model: Specification.ExternalScript, options: BuildOptions): ExternalScriptIntersection {
+  const instance = new Classes.ExternalScript(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ExternalScriptIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ExternalScriptIntersection`
+ * @returns {Builder} A builder for `ExternalScriptIntersection`
+ */
+export const externalScriptBuilder = (
+  model?: Partial,
+): Builder, ExternalScriptIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/flow-directive-builder.ts b/src/lib/generated/builders/flow-directive-builder.ts
new file mode 100644
index 00000000..44f2a0ce
--- /dev/null
+++ b/src/lib/generated/builders/flow-directive-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { FlowDirectiveIntersection } from '../classes/flow-directive';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.FlowDirective} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {FlowDirectiveIntersection} The built object
+ */
+function buildingFn(model: Specification.FlowDirective, options: BuildOptions): FlowDirectiveIntersection {
+  const instance = new Classes.FlowDirective(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as FlowDirectiveIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `FlowDirectiveIntersection`
+ * @returns {Builder} A builder for `FlowDirectiveIntersection`
+ */
+export const flowDirectiveBuilder = (
+  model?: Partial,
+): Builder, FlowDirectiveIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/for-task-builder.ts b/src/lib/generated/builders/for-task-builder.ts
new file mode 100644
index 00000000..2e56e415
--- /dev/null
+++ b/src/lib/generated/builders/for-task-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ForTaskIntersection } from '../classes/for-task';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ForTask} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ForTaskIntersection} The built object
+ */
+function buildingFn(model: Specification.ForTask, options: BuildOptions): ForTaskIntersection {
+  const instance = new Classes.ForTask(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ForTaskIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ForTaskIntersection`
+ * @returns {Builder} A builder for `ForTaskIntersection`
+ */
+export const forTaskBuilder = (
+  model?: Partial,
+): Builder, ForTaskIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/for-task-configuration-builder.ts b/src/lib/generated/builders/for-task-configuration-builder.ts
new file mode 100644
index 00000000..080b053e
--- /dev/null
+++ b/src/lib/generated/builders/for-task-configuration-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ForTaskConfigurationIntersection } from '../classes/for-task-configuration';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ForTaskConfiguration} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ForTaskConfigurationIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.ForTaskConfiguration,
+  options: BuildOptions,
+): ForTaskConfigurationIntersection {
+  const instance = new Classes.ForTaskConfiguration(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ForTaskConfigurationIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ForTaskConfigurationIntersection`
+ * @returns {Builder} A builder for `ForTaskConfigurationIntersection`
+ */
+export const forTaskConfigurationBuilder = (
+  model?: Partial,
+): Builder, ForTaskConfigurationIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/fork-task-builder.ts b/src/lib/generated/builders/fork-task-builder.ts
new file mode 100644
index 00000000..0c79c54c
--- /dev/null
+++ b/src/lib/generated/builders/fork-task-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ForkTaskIntersection } from '../classes/fork-task';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ForkTask} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ForkTaskIntersection} The built object
+ */
+function buildingFn(model: Specification.ForkTask, options: BuildOptions): ForkTaskIntersection {
+  const instance = new Classes.ForkTask(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ForkTaskIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ForkTaskIntersection`
+ * @returns {Builder} A builder for `ForkTaskIntersection`
+ */
+export const forkTaskBuilder = (
+  model?: Partial,
+): Builder, ForkTaskIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/fork-task-configuration-builder.ts b/src/lib/generated/builders/fork-task-configuration-builder.ts
new file mode 100644
index 00000000..fbfecb67
--- /dev/null
+++ b/src/lib/generated/builders/fork-task-configuration-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ForkTaskConfigurationIntersection } from '../classes/fork-task-configuration';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ForkTaskConfiguration} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ForkTaskConfigurationIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.ForkTaskConfiguration,
+  options: BuildOptions,
+): ForkTaskConfigurationIntersection {
+  const instance = new Classes.ForkTaskConfiguration(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ForkTaskConfigurationIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ForkTaskConfigurationIntersection`
+ * @returns {Builder} A builder for `ForkTaskConfigurationIntersection`
+ */
+export const forkTaskConfigurationBuilder = (
+  model?: Partial,
+): Builder, ForkTaskConfigurationIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/function-arguments-builder.ts b/src/lib/generated/builders/function-arguments-builder.ts
new file mode 100644
index 00000000..a2523c12
--- /dev/null
+++ b/src/lib/generated/builders/function-arguments-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { FunctionArgumentsIntersection } from '../classes/function-arguments';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.FunctionArguments} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {FunctionArgumentsIntersection} The built object
+ */
+function buildingFn(model: Specification.FunctionArguments, options: BuildOptions): FunctionArgumentsIntersection {
+  const instance = new Classes.FunctionArguments(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as FunctionArgumentsIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `FunctionArgumentsIntersection`
+ * @returns {Builder} A builder for `FunctionArgumentsIntersection`
+ */
+export const functionArgumentsBuilder = (
+  model?: Partial,
+): Builder, FunctionArgumentsIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/grpc-arguments-builder.ts b/src/lib/generated/builders/grpc-arguments-builder.ts
new file mode 100644
index 00000000..e8294dee
--- /dev/null
+++ b/src/lib/generated/builders/grpc-arguments-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { GRPCArgumentsIntersection } from '../classes/grpc-arguments';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.GRPCArguments} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {GRPCArgumentsIntersection} The built object
+ */
+function buildingFn(model: Specification.GRPCArguments, options: BuildOptions): GRPCArgumentsIntersection {
+  const instance = new Classes.GRPCArguments(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as GRPCArgumentsIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `GRPCArgumentsIntersection`
+ * @returns {Builder} A builder for `GRPCArgumentsIntersection`
+ */
+export const gRPCArgumentsBuilder = (
+  model?: Partial,
+): Builder, GRPCArgumentsIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/http-arguments-builder.ts b/src/lib/generated/builders/http-arguments-builder.ts
new file mode 100644
index 00000000..3997f63e
--- /dev/null
+++ b/src/lib/generated/builders/http-arguments-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { HTTPArgumentsIntersection } from '../classes/http-arguments';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.HTTPArguments} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {HTTPArgumentsIntersection} The built object
+ */
+function buildingFn(model: Specification.HTTPArguments, options: BuildOptions): HTTPArgumentsIntersection {
+  const instance = new Classes.HTTPArguments(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as HTTPArgumentsIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `HTTPArgumentsIntersection`
+ * @returns {Builder} A builder for `HTTPArgumentsIntersection`
+ */
+export const hTTPArgumentsBuilder = (
+  model?: Partial,
+): Builder, HTTPArgumentsIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/http-body-builder.ts b/src/lib/generated/builders/http-body-builder.ts
new file mode 100644
index 00000000..0e154957
--- /dev/null
+++ b/src/lib/generated/builders/http-body-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { HTTPBodyIntersection } from '../classes/http-body';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.HTTPBody} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {HTTPBodyIntersection} The built object
+ */
+function buildingFn(model: Specification.HTTPBody, options: BuildOptions): HTTPBodyIntersection {
+  const instance = new Classes.HTTPBody(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as HTTPBodyIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `HTTPBodyIntersection`
+ * @returns {Builder} A builder for `HTTPBodyIntersection`
+ */
+export const hTTPBodyBuilder = (
+  model?: Partial,
+): Builder, HTTPBodyIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/http-headers-builder.ts b/src/lib/generated/builders/http-headers-builder.ts
new file mode 100644
index 00000000..ff00e6cb
--- /dev/null
+++ b/src/lib/generated/builders/http-headers-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { HTTPHeadersIntersection } from '../classes/http-headers';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.HTTPHeaders} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {HTTPHeadersIntersection} The built object
+ */
+function buildingFn(model: Specification.HTTPHeaders, options: BuildOptions): HTTPHeadersIntersection {
+  const instance = new Classes.HTTPHeaders(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as HTTPHeadersIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `HTTPHeadersIntersection`
+ * @returns {Builder} A builder for `HTTPHeadersIntersection`
+ */
+export const hTTPHeadersBuilder = (
+  model?: Partial,
+): Builder, HTTPHeadersIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/http-query-builder.ts b/src/lib/generated/builders/http-query-builder.ts
new file mode 100644
index 00000000..a185169d
--- /dev/null
+++ b/src/lib/generated/builders/http-query-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { HTTPQueryIntersection } from '../classes/http-query';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.HTTPQuery} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {HTTPQueryIntersection} The built object
+ */
+function buildingFn(model: Specification.HTTPQuery, options: BuildOptions): HTTPQueryIntersection {
+  const instance = new Classes.HTTPQuery(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as HTTPQueryIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `HTTPQueryIntersection`
+ * @returns {Builder} A builder for `HTTPQueryIntersection`
+ */
+export const hTTPQueryBuilder = (
+  model?: Partial,
+): Builder, HTTPQueryIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/index.ts b/src/lib/generated/builders/index.ts
new file mode 100644
index 00000000..027ec6a0
--- /dev/null
+++ b/src/lib/generated/builders/index.ts
@@ -0,0 +1,176 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export * from './all-event-consumption-strategy-builder';
+export * from './all-event-consumption-strategy-configuration-builder';
+export * from './any-event-consumption-strategy-builder';
+export * from './any-event-consumption-strategy-configuration-builder';
+export * from './any-event-consumption-strategy-until-builder';
+export * from './any-event-until-consumed-builder';
+export * from './async-api-arguments-builder';
+export * from './authentication-policy-builder';
+export * from './authentication-policy-reference-builder';
+export * from './basic-authentication-policy-builder';
+export * from './basic-authentication-policy-configuration-builder';
+export * from './basic-authentication-properties-builder';
+export * from './bearer-authentication-policy-builder';
+export * from './bearer-authentication-policy-configuration-builder';
+export * from './bearer-authentication-properties-builder';
+export * from './call-async-api-builder';
+export * from './call-function-builder';
+export * from './call-grpc-builder';
+export * from './call-http-builder';
+export * from './call-open-api-builder';
+export * from './call-task-builder';
+export * from './catalog-builder';
+export * from './catch-errors-builder';
+export * from './constant-backoff-builder';
+export * from './container-builder';
+export * from './container-environment-builder';
+export * from './container-lifetime-builder';
+export * from './container-ports-builder';
+export * from './container-volumes-builder';
+export * from './digest-authentication-policy-builder';
+export * from './digest-authentication-policy-configuration-builder';
+export * from './digest-authentication-properties-builder';
+export * from './document-builder';
+export * from './do-task-builder';
+export * from './duration-builder';
+export * from './duration-inline-builder';
+export * from './emit-event-definition-builder';
+export * from './emit-event-with-builder';
+export * from './emit-task-builder';
+export * from './emit-task-configuration-builder';
+export * from './endpoint-builder';
+export * from './endpoint-configuration-builder';
+export * from './endpoint-uri-builder';
+export * from './error-builder';
+export * from './error-filter-builder';
+export * from './error-instance-builder';
+export * from './error-type-builder';
+export * from './event-consumption-strategy-builder';
+export * from './event-data-builder';
+export * from './event-dataschema-builder';
+export * from './event-filter-builder';
+export * from './event-filter-correlate-builder';
+export * from './event-source-builder';
+export * from './event-time-builder';
+export * from './exponential-back-off-builder';
+export * from './export-builder';
+export * from './export-as-builder';
+export * from './extension-builder';
+export * from './extension-item-builder';
+export * from './external-resource-builder';
+export * from './external-script-builder';
+export * from './flow-directive-builder';
+export * from './fork-task-builder';
+export * from './fork-task-configuration-builder';
+export * from './for-task-builder';
+export * from './for-task-configuration-builder';
+export * from './function-arguments-builder';
+export * from './grpc-arguments-builder';
+export * from './http-arguments-builder';
+export * from './http-body-builder';
+export * from './http-headers-builder';
+export * from './http-query-builder';
+export * from './inline-script-builder';
+export * from './input-builder';
+export * from './input-from-builder';
+export * from './linear-backoff-builder';
+export * from './listen-task-builder';
+export * from './listen-task-configuration-builder';
+export * from './oauth2-autenthication-data-builder';
+export * from './oauth2-autenthication-data-audiences-builder';
+export * from './oauth2-autenthication-data-client-builder';
+export * from './oauth2-autenthication-data-scopes-builder';
+export * from './oauth2-authentication-policy-builder';
+export * from './oauth2-authentication-policy-configuration-builder';
+export * from './oauth2-authentication-properties-endpoints-builder';
+export * from './oauth2-connect-authentication-properties-builder';
+export * from './oauth2-issuers-builder';
+export * from './oauth2-token-definition-builder';
+export * from './oauth2-token-request-builder';
+export * from './one-event-consumption-strategy-builder';
+export * from './open-api-arguments-builder';
+export * from './open-id-connect-authentication-policy-builder';
+export * from './open-id-connect-authentication-policy-configuration-builder';
+export * from './open-id-connect-authentication-properties-builder';
+export * from './output-builder';
+export * from './output-as-builder';
+export * from './raise-task-builder';
+export * from './raise-task-configuration-builder';
+export * from './raise-task-error-builder';
+export * from './referenceable-authentication-policy-builder';
+export * from './retry-backoff-builder';
+export * from './retry-limit-builder';
+export * from './retry-limit-attempt-builder';
+export * from './retry-policy-builder';
+export * from './retry-policy-jitter-builder';
+export * from './run-container-builder';
+export * from './run-script-builder';
+export * from './run-shell-builder';
+export * from './run-task-builder';
+export * from './run-task-configuration-builder';
+export * from './runtime-expression-builder';
+export * from './run-workflow-builder';
+export * from './schedule-builder';
+export * from './schema-builder';
+export * from './schema-external-builder';
+export * from './schema-inline-builder';
+export * from './script-builder';
+export * from './secret-based-authentication-policy-builder';
+export * from './set-task-builder';
+export * from './set-task-configuration-builder';
+export * from './shell-builder';
+export * from './shell-arguments-builder';
+export * from './shell-environment-builder';
+export * from './subflow-configuration-builder';
+export * from './subflow-input-builder';
+export * from './subscription-iterator-builder';
+export * from './switch-case-builder';
+export * from './switch-item-builder';
+export * from './switch-task-builder';
+export * from './switch-task-configuration-builder';
+export * from './task-builder';
+export * from './task-base-builder';
+export * from './task-base-if-builder';
+export * from './task-item-builder';
+export * from './task-list-builder';
+export * from './task-metadata-builder';
+export * from './task-timeout-builder';
+export * from './timeout-builder';
+export * from './try-task-builder';
+export * from './try-task-catch-builder';
+export * from './try-task-catch-retry-builder';
+export * from './uri-template-builder';
+export * from './use-builder';
+export * from './use-authentications-builder';
+export * from './use-catalogs-builder';
+export * from './use-errors-builder';
+export * from './use-extensions-builder';
+export * from './use-functions-builder';
+export * from './use-retries-builder';
+export * from './use-secrets-builder';
+export * from './use-timeouts-builder';
+export * from './wait-task-builder';
+export * from './with-event-builder';
+export * from './with-grpc-arguments-builder';
+export * from './with-grpc-service-builder';
+export * from './with-open-api-parameters-builder';
+export * from './workflow-builder';
+export * from './workflow-metadata-builder';
+export * from './workflow-tags-builder';
+export * from './workflow-timeout-builder';
diff --git a/src/lib/generated/builders/inline-script-builder.ts b/src/lib/generated/builders/inline-script-builder.ts
new file mode 100644
index 00000000..6dfca93d
--- /dev/null
+++ b/src/lib/generated/builders/inline-script-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { InlineScriptIntersection } from '../classes/inline-script';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.InlineScript} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {InlineScriptIntersection} The built object
+ */
+function buildingFn(model: Specification.InlineScript, options: BuildOptions): InlineScriptIntersection {
+  const instance = new Classes.InlineScript(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as InlineScriptIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `InlineScriptIntersection`
+ * @returns {Builder} A builder for `InlineScriptIntersection`
+ */
+export const inlineScriptBuilder = (
+  model?: Partial,
+): Builder, InlineScriptIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/input-builder.ts b/src/lib/generated/builders/input-builder.ts
new file mode 100644
index 00000000..f7bb11eb
--- /dev/null
+++ b/src/lib/generated/builders/input-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { InputIntersection } from '../classes/input';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.Input} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {InputIntersection} The built object
+ */
+function buildingFn(model: Specification.Input, options: BuildOptions): InputIntersection {
+  const instance = new Classes.Input(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as InputIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `InputIntersection`
+ * @returns {Builder} A builder for `InputIntersection`
+ */
+export const inputBuilder = (
+  model?: Partial,
+): Builder, InputIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/input-from-builder.ts b/src/lib/generated/builders/input-from-builder.ts
new file mode 100644
index 00000000..f69c64cc
--- /dev/null
+++ b/src/lib/generated/builders/input-from-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { InputFromIntersection } from '../classes/input-from';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.InputFrom} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {InputFromIntersection} The built object
+ */
+function buildingFn(model: Specification.InputFrom, options: BuildOptions): InputFromIntersection {
+  const instance = new Classes.InputFrom(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as InputFromIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `InputFromIntersection`
+ * @returns {Builder} A builder for `InputFromIntersection`
+ */
+export const inputFromBuilder = (
+  model?: Partial,
+): Builder, InputFromIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/linear-backoff-builder.ts b/src/lib/generated/builders/linear-backoff-builder.ts
new file mode 100644
index 00000000..deeb0ea2
--- /dev/null
+++ b/src/lib/generated/builders/linear-backoff-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { LinearBackoffIntersection } from '../classes/linear-backoff';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.LinearBackoff} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {LinearBackoffIntersection} The built object
+ */
+function buildingFn(model: Specification.LinearBackoff, options: BuildOptions): LinearBackoffIntersection {
+  const instance = new Classes.LinearBackoff(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as LinearBackoffIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `LinearBackoffIntersection`
+ * @returns {Builder} A builder for `LinearBackoffIntersection`
+ */
+export const linearBackoffBuilder = (
+  model?: Partial,
+): Builder, LinearBackoffIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/listen-task-builder.ts b/src/lib/generated/builders/listen-task-builder.ts
new file mode 100644
index 00000000..597b735a
--- /dev/null
+++ b/src/lib/generated/builders/listen-task-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ListenTaskIntersection } from '../classes/listen-task';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ListenTask} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ListenTaskIntersection} The built object
+ */
+function buildingFn(model: Specification.ListenTask, options: BuildOptions): ListenTaskIntersection {
+  const instance = new Classes.ListenTask(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ListenTaskIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ListenTaskIntersection`
+ * @returns {Builder} A builder for `ListenTaskIntersection`
+ */
+export const listenTaskBuilder = (
+  model?: Partial,
+): Builder, ListenTaskIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/listen-task-configuration-builder.ts b/src/lib/generated/builders/listen-task-configuration-builder.ts
new file mode 100644
index 00000000..60feb31e
--- /dev/null
+++ b/src/lib/generated/builders/listen-task-configuration-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ListenTaskConfigurationIntersection } from '../classes/listen-task-configuration';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ListenTaskConfiguration} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ListenTaskConfigurationIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.ListenTaskConfiguration,
+  options: BuildOptions,
+): ListenTaskConfigurationIntersection {
+  const instance = new Classes.ListenTaskConfiguration(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ListenTaskConfigurationIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ListenTaskConfigurationIntersection`
+ * @returns {Builder} A builder for `ListenTaskConfigurationIntersection`
+ */
+export const listenTaskConfigurationBuilder = (
+  model?: Partial,
+): Builder, ListenTaskConfigurationIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/oauth2-autenthication-data-audiences-builder.ts b/src/lib/generated/builders/oauth2-autenthication-data-audiences-builder.ts
new file mode 100644
index 00000000..da49de46
--- /dev/null
+++ b/src/lib/generated/builders/oauth2-autenthication-data-audiences-builder.ts
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { arrayBuilder, ArrayBuilder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { OAuth2AutenthicationDataAudiencesIntersection } from '../classes/oauth2-autenthication-data-audiences';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying array
+ * @param {Specification.OAuth2AutenthicationDataAudiences} model The proxied array
+ * @param {BuildOptions} options The build options to use
+ * @returns {OAuth2AutenthicationDataAudiencesIntersection} The built array
+ */
+function buildingFn(
+  model: Specification.OAuth2AutenthicationDataAudiences,
+  options: BuildOptions,
+): OAuth2AutenthicationDataAudiencesIntersection {
+  const instance = new Classes.OAuth2AutenthicationDataAudiences(model);
+  if (options.validate) instance.validate();
+  return (options.normalize
+    ? instance.normalize()
+    : instance) as unknown as OAuth2AutenthicationDataAudiencesIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `OAuth2AutenthicationDataAudiencesIntersection`
+ * @returns {ArrayBuilder} A builder for `OAuth2AutenthicationDataAudiencesIntersection`
+ */
+export const oAuth2AutenthicationDataAudiencesBuilder = (
+  model?: Specification.OAuth2AutenthicationDataAudiences,
+): ArrayBuilder =>
+  arrayBuilder(model, buildingFn);
diff --git a/src/lib/generated/builders/oauth2-autenthication-data-builder.ts b/src/lib/generated/builders/oauth2-autenthication-data-builder.ts
new file mode 100644
index 00000000..42f476a3
--- /dev/null
+++ b/src/lib/generated/builders/oauth2-autenthication-data-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { OAuth2AutenthicationDataIntersection } from '../classes/oauth2-autenthication-data';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.OAuth2AutenthicationData} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {OAuth2AutenthicationDataIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.OAuth2AutenthicationData,
+  options: BuildOptions,
+): OAuth2AutenthicationDataIntersection {
+  const instance = new Classes.OAuth2AutenthicationData(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as OAuth2AutenthicationDataIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `OAuth2AutenthicationDataIntersection`
+ * @returns {Builder} A builder for `OAuth2AutenthicationDataIntersection`
+ */
+export const oAuth2AutenthicationDataBuilder = (
+  model?: Partial,
+): Builder, OAuth2AutenthicationDataIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/oauth2-autenthication-data-client-builder.ts b/src/lib/generated/builders/oauth2-autenthication-data-client-builder.ts
new file mode 100644
index 00000000..dcbc5fde
--- /dev/null
+++ b/src/lib/generated/builders/oauth2-autenthication-data-client-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { OAuth2AutenthicationDataClientIntersection } from '../classes/oauth2-autenthication-data-client';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.OAuth2AutenthicationDataClient} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {OAuth2AutenthicationDataClientIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.OAuth2AutenthicationDataClient,
+  options: BuildOptions,
+): OAuth2AutenthicationDataClientIntersection {
+  const instance = new Classes.OAuth2AutenthicationDataClient(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as OAuth2AutenthicationDataClientIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `OAuth2AutenthicationDataClientIntersection`
+ * @returns {Builder} A builder for `OAuth2AutenthicationDataClientIntersection`
+ */
+export const oAuth2AutenthicationDataClientBuilder = (
+  model?: Partial,
+): Builder, OAuth2AutenthicationDataClientIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/oauth2-autenthication-data-scopes-builder.ts b/src/lib/generated/builders/oauth2-autenthication-data-scopes-builder.ts
new file mode 100644
index 00000000..54bf64cc
--- /dev/null
+++ b/src/lib/generated/builders/oauth2-autenthication-data-scopes-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { arrayBuilder, ArrayBuilder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { OAuth2AutenthicationDataScopesIntersection } from '../classes/oauth2-autenthication-data-scopes';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying array
+ * @param {Specification.OAuth2AutenthicationDataScopes} model The proxied array
+ * @param {BuildOptions} options The build options to use
+ * @returns {OAuth2AutenthicationDataScopesIntersection} The built array
+ */
+function buildingFn(
+  model: Specification.OAuth2AutenthicationDataScopes,
+  options: BuildOptions,
+): OAuth2AutenthicationDataScopesIntersection {
+  const instance = new Classes.OAuth2AutenthicationDataScopes(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as unknown as OAuth2AutenthicationDataScopesIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `OAuth2AutenthicationDataScopesIntersection`
+ * @returns {ArrayBuilder} A builder for `OAuth2AutenthicationDataScopesIntersection`
+ */
+export const oAuth2AutenthicationDataScopesBuilder = (
+  model?: Specification.OAuth2AutenthicationDataScopes,
+): ArrayBuilder =>
+  arrayBuilder(model, buildingFn);
diff --git a/src/lib/generated/builders/oauth2-authentication-policy-builder.ts b/src/lib/generated/builders/oauth2-authentication-policy-builder.ts
new file mode 100644
index 00000000..949c5f0e
--- /dev/null
+++ b/src/lib/generated/builders/oauth2-authentication-policy-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { OAuth2AuthenticationPolicyIntersection } from '../classes/oauth2-authentication-policy';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.OAuth2AuthenticationPolicy} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {OAuth2AuthenticationPolicyIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.OAuth2AuthenticationPolicy,
+  options: BuildOptions,
+): OAuth2AuthenticationPolicyIntersection {
+  const instance = new Classes.OAuth2AuthenticationPolicy(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as OAuth2AuthenticationPolicyIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `OAuth2AuthenticationPolicyIntersection`
+ * @returns {Builder} A builder for `OAuth2AuthenticationPolicyIntersection`
+ */
+export const oAuth2AuthenticationPolicyBuilder = (
+  model?: Partial,
+): Builder, OAuth2AuthenticationPolicyIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/oauth2-authentication-policy-configuration-builder.ts b/src/lib/generated/builders/oauth2-authentication-policy-configuration-builder.ts
new file mode 100644
index 00000000..60923864
--- /dev/null
+++ b/src/lib/generated/builders/oauth2-authentication-policy-configuration-builder.ts
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { OAuth2AuthenticationPolicyConfigurationIntersection } from '../classes/oauth2-authentication-policy-configuration';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.OAuth2AuthenticationPolicyConfiguration} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {OAuth2AuthenticationPolicyConfigurationIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.OAuth2AuthenticationPolicyConfiguration,
+  options: BuildOptions,
+): OAuth2AuthenticationPolicyConfigurationIntersection {
+  const instance = new Classes.OAuth2AuthenticationPolicyConfiguration(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as OAuth2AuthenticationPolicyConfigurationIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `OAuth2AuthenticationPolicyConfigurationIntersection`
+ * @returns {Builder} A builder for `OAuth2AuthenticationPolicyConfigurationIntersection`
+ */
+export const oAuth2AuthenticationPolicyConfigurationBuilder = (
+  model?: Partial,
+): Builder<
+  Partial,
+  OAuth2AuthenticationPolicyConfigurationIntersection
+> =>
+  builder(
+    model,
+    buildingFn,
+  );
diff --git a/src/lib/generated/builders/oauth2-authentication-properties-endpoints-builder.ts b/src/lib/generated/builders/oauth2-authentication-properties-endpoints-builder.ts
new file mode 100644
index 00000000..8f62cb4e
--- /dev/null
+++ b/src/lib/generated/builders/oauth2-authentication-properties-endpoints-builder.ts
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { OAuth2AuthenticationPropertiesEndpointsIntersection } from '../classes/oauth2-authentication-properties-endpoints';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.OAuth2AuthenticationPropertiesEndpoints} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {OAuth2AuthenticationPropertiesEndpointsIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.OAuth2AuthenticationPropertiesEndpoints,
+  options: BuildOptions,
+): OAuth2AuthenticationPropertiesEndpointsIntersection {
+  const instance = new Classes.OAuth2AuthenticationPropertiesEndpoints(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as OAuth2AuthenticationPropertiesEndpointsIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `OAuth2AuthenticationPropertiesEndpointsIntersection`
+ * @returns {Builder} A builder for `OAuth2AuthenticationPropertiesEndpointsIntersection`
+ */
+export const oAuth2AuthenticationPropertiesEndpointsBuilder = (
+  model?: Partial,
+): Builder<
+  Partial,
+  OAuth2AuthenticationPropertiesEndpointsIntersection
+> =>
+  builder(
+    model,
+    buildingFn,
+  );
diff --git a/src/lib/generated/builders/oauth2-connect-authentication-properties-builder.ts b/src/lib/generated/builders/oauth2-connect-authentication-properties-builder.ts
new file mode 100644
index 00000000..10b84896
--- /dev/null
+++ b/src/lib/generated/builders/oauth2-connect-authentication-properties-builder.ts
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { OAuth2ConnectAuthenticationPropertiesIntersection } from '../classes/oauth2-connect-authentication-properties';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.OAuth2ConnectAuthenticationProperties} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {OAuth2ConnectAuthenticationPropertiesIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.OAuth2ConnectAuthenticationProperties,
+  options: BuildOptions,
+): OAuth2ConnectAuthenticationPropertiesIntersection {
+  const instance = new Classes.OAuth2ConnectAuthenticationProperties(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as OAuth2ConnectAuthenticationPropertiesIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `OAuth2ConnectAuthenticationPropertiesIntersection`
+ * @returns {Builder} A builder for `OAuth2ConnectAuthenticationPropertiesIntersection`
+ */
+export const oAuth2ConnectAuthenticationPropertiesBuilder = (
+  model?: Partial,
+): Builder<
+  Partial,
+  OAuth2ConnectAuthenticationPropertiesIntersection
+> =>
+  builder(
+    model,
+    buildingFn,
+  );
diff --git a/src/lib/generated/builders/oauth2-issuers-builder.ts b/src/lib/generated/builders/oauth2-issuers-builder.ts
new file mode 100644
index 00000000..6b2ab4b5
--- /dev/null
+++ b/src/lib/generated/builders/oauth2-issuers-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { arrayBuilder, ArrayBuilder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { OAuth2IssuersIntersection } from '../classes/oauth2-issuers';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying array
+ * @param {Specification.OAuth2Issuers} model The proxied array
+ * @param {BuildOptions} options The build options to use
+ * @returns {OAuth2IssuersIntersection} The built array
+ */
+function buildingFn(model: Specification.OAuth2Issuers, options: BuildOptions): OAuth2IssuersIntersection {
+  const instance = new Classes.OAuth2Issuers(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as unknown as OAuth2IssuersIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `OAuth2IssuersIntersection`
+ * @returns {ArrayBuilder} A builder for `OAuth2IssuersIntersection`
+ */
+export const oAuth2IssuersBuilder = (
+  model?: Specification.OAuth2Issuers,
+): ArrayBuilder =>
+  arrayBuilder(model, buildingFn);
diff --git a/src/lib/generated/builders/oauth2-token-definition-builder.ts b/src/lib/generated/builders/oauth2-token-definition-builder.ts
new file mode 100644
index 00000000..68ff0bb8
--- /dev/null
+++ b/src/lib/generated/builders/oauth2-token-definition-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { OAuth2TokenDefinitionIntersection } from '../classes/oauth2-token-definition';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.OAuth2TokenDefinition} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {OAuth2TokenDefinitionIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.OAuth2TokenDefinition,
+  options: BuildOptions,
+): OAuth2TokenDefinitionIntersection {
+  const instance = new Classes.OAuth2TokenDefinition(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as OAuth2TokenDefinitionIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `OAuth2TokenDefinitionIntersection`
+ * @returns {Builder} A builder for `OAuth2TokenDefinitionIntersection`
+ */
+export const oAuth2TokenDefinitionBuilder = (
+  model?: Partial,
+): Builder, OAuth2TokenDefinitionIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/oauth2-token-request-builder.ts b/src/lib/generated/builders/oauth2-token-request-builder.ts
new file mode 100644
index 00000000..7d417a5c
--- /dev/null
+++ b/src/lib/generated/builders/oauth2-token-request-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { OAuth2TokenRequestIntersection } from '../classes/oauth2-token-request';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.OAuth2TokenRequest} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {OAuth2TokenRequestIntersection} The built object
+ */
+function buildingFn(model: Specification.OAuth2TokenRequest, options: BuildOptions): OAuth2TokenRequestIntersection {
+  const instance = new Classes.OAuth2TokenRequest(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as OAuth2TokenRequestIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `OAuth2TokenRequestIntersection`
+ * @returns {Builder} A builder for `OAuth2TokenRequestIntersection`
+ */
+export const oAuth2TokenRequestBuilder = (
+  model?: Partial,
+): Builder, OAuth2TokenRequestIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/one-event-consumption-strategy-builder.ts b/src/lib/generated/builders/one-event-consumption-strategy-builder.ts
new file mode 100644
index 00000000..7af05a14
--- /dev/null
+++ b/src/lib/generated/builders/one-event-consumption-strategy-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { OneEventConsumptionStrategyIntersection } from '../classes/one-event-consumption-strategy';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.OneEventConsumptionStrategy} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {OneEventConsumptionStrategyIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.OneEventConsumptionStrategy,
+  options: BuildOptions,
+): OneEventConsumptionStrategyIntersection {
+  const instance = new Classes.OneEventConsumptionStrategy(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as OneEventConsumptionStrategyIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `OneEventConsumptionStrategyIntersection`
+ * @returns {Builder} A builder for `OneEventConsumptionStrategyIntersection`
+ */
+export const oneEventConsumptionStrategyBuilder = (
+  model?: Partial,
+): Builder, OneEventConsumptionStrategyIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/open-api-arguments-builder.ts b/src/lib/generated/builders/open-api-arguments-builder.ts
new file mode 100644
index 00000000..1ea8354c
--- /dev/null
+++ b/src/lib/generated/builders/open-api-arguments-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { OpenAPIArgumentsIntersection } from '../classes/open-api-arguments';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.OpenAPIArguments} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {OpenAPIArgumentsIntersection} The built object
+ */
+function buildingFn(model: Specification.OpenAPIArguments, options: BuildOptions): OpenAPIArgumentsIntersection {
+  const instance = new Classes.OpenAPIArguments(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as OpenAPIArgumentsIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `OpenAPIArgumentsIntersection`
+ * @returns {Builder} A builder for `OpenAPIArgumentsIntersection`
+ */
+export const openAPIArgumentsBuilder = (
+  model?: Partial,
+): Builder, OpenAPIArgumentsIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/open-id-connect-authentication-policy-builder.ts b/src/lib/generated/builders/open-id-connect-authentication-policy-builder.ts
new file mode 100644
index 00000000..c1ede40a
--- /dev/null
+++ b/src/lib/generated/builders/open-id-connect-authentication-policy-builder.ts
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { OpenIdConnectAuthenticationPolicyIntersection } from '../classes/open-id-connect-authentication-policy';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.OpenIdConnectAuthenticationPolicy} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {OpenIdConnectAuthenticationPolicyIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.OpenIdConnectAuthenticationPolicy,
+  options: BuildOptions,
+): OpenIdConnectAuthenticationPolicyIntersection {
+  const instance = new Classes.OpenIdConnectAuthenticationPolicy(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as OpenIdConnectAuthenticationPolicyIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `OpenIdConnectAuthenticationPolicyIntersection`
+ * @returns {Builder} A builder for `OpenIdConnectAuthenticationPolicyIntersection`
+ */
+export const openIdConnectAuthenticationPolicyBuilder = (
+  model?: Partial,
+): Builder, OpenIdConnectAuthenticationPolicyIntersection> =>
+  builder(
+    model,
+    buildingFn,
+  );
diff --git a/src/lib/generated/builders/open-id-connect-authentication-policy-configuration-builder.ts b/src/lib/generated/builders/open-id-connect-authentication-policy-configuration-builder.ts
new file mode 100644
index 00000000..2989d3ea
--- /dev/null
+++ b/src/lib/generated/builders/open-id-connect-authentication-policy-configuration-builder.ts
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { OpenIdConnectAuthenticationPolicyConfigurationIntersection } from '../classes/open-id-connect-authentication-policy-configuration';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.OpenIdConnectAuthenticationPolicyConfiguration} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {OpenIdConnectAuthenticationPolicyConfigurationIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.OpenIdConnectAuthenticationPolicyConfiguration,
+  options: BuildOptions,
+): OpenIdConnectAuthenticationPolicyConfigurationIntersection {
+  const instance = new Classes.OpenIdConnectAuthenticationPolicyConfiguration(model);
+  if (options.validate) instance.validate();
+  return (
+    options.normalize ? instance.normalize() : instance
+  ) as OpenIdConnectAuthenticationPolicyConfigurationIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `OpenIdConnectAuthenticationPolicyConfigurationIntersection`
+ * @returns {Builder} A builder for `OpenIdConnectAuthenticationPolicyConfigurationIntersection`
+ */
+export const openIdConnectAuthenticationPolicyConfigurationBuilder = (
+  model?: Partial,
+): Builder<
+  Partial,
+  OpenIdConnectAuthenticationPolicyConfigurationIntersection
+> =>
+  builder<
+    Specification.OpenIdConnectAuthenticationPolicyConfiguration,
+    OpenIdConnectAuthenticationPolicyConfigurationIntersection
+  >(model, buildingFn);
diff --git a/src/lib/generated/builders/open-id-connect-authentication-properties-builder.ts b/src/lib/generated/builders/open-id-connect-authentication-properties-builder.ts
new file mode 100644
index 00000000..e13302b8
--- /dev/null
+++ b/src/lib/generated/builders/open-id-connect-authentication-properties-builder.ts
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { OpenIdConnectAuthenticationPropertiesIntersection } from '../classes/open-id-connect-authentication-properties';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.OpenIdConnectAuthenticationProperties} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {OpenIdConnectAuthenticationPropertiesIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.OpenIdConnectAuthenticationProperties,
+  options: BuildOptions,
+): OpenIdConnectAuthenticationPropertiesIntersection {
+  const instance = new Classes.OpenIdConnectAuthenticationProperties(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as OpenIdConnectAuthenticationPropertiesIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `OpenIdConnectAuthenticationPropertiesIntersection`
+ * @returns {Builder} A builder for `OpenIdConnectAuthenticationPropertiesIntersection`
+ */
+export const openIdConnectAuthenticationPropertiesBuilder = (
+  model?: Partial,
+): Builder<
+  Partial,
+  OpenIdConnectAuthenticationPropertiesIntersection
+> =>
+  builder(
+    model,
+    buildingFn,
+  );
diff --git a/src/lib/generated/builders/output-as-builder.ts b/src/lib/generated/builders/output-as-builder.ts
new file mode 100644
index 00000000..b2673098
--- /dev/null
+++ b/src/lib/generated/builders/output-as-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { OutputAsIntersection } from '../classes/output-as';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.OutputAs} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {OutputAsIntersection} The built object
+ */
+function buildingFn(model: Specification.OutputAs, options: BuildOptions): OutputAsIntersection {
+  const instance = new Classes.OutputAs(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as OutputAsIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `OutputAsIntersection`
+ * @returns {Builder} A builder for `OutputAsIntersection`
+ */
+export const outputAsBuilder = (
+  model?: Partial,
+): Builder, OutputAsIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/output-builder.ts b/src/lib/generated/builders/output-builder.ts
new file mode 100644
index 00000000..098478d3
--- /dev/null
+++ b/src/lib/generated/builders/output-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { OutputIntersection } from '../classes/output';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.Output} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {OutputIntersection} The built object
+ */
+function buildingFn(model: Specification.Output, options: BuildOptions): OutputIntersection {
+  const instance = new Classes.Output(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as OutputIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `OutputIntersection`
+ * @returns {Builder} A builder for `OutputIntersection`
+ */
+export const outputBuilder = (
+  model?: Partial,
+): Builder, OutputIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/raise-task-builder.ts b/src/lib/generated/builders/raise-task-builder.ts
new file mode 100644
index 00000000..b2ecda8d
--- /dev/null
+++ b/src/lib/generated/builders/raise-task-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { RaiseTaskIntersection } from '../classes/raise-task';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.RaiseTask} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {RaiseTaskIntersection} The built object
+ */
+function buildingFn(model: Specification.RaiseTask, options: BuildOptions): RaiseTaskIntersection {
+  const instance = new Classes.RaiseTask(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as RaiseTaskIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `RaiseTaskIntersection`
+ * @returns {Builder} A builder for `RaiseTaskIntersection`
+ */
+export const raiseTaskBuilder = (
+  model?: Partial,
+): Builder, RaiseTaskIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/raise-task-configuration-builder.ts b/src/lib/generated/builders/raise-task-configuration-builder.ts
new file mode 100644
index 00000000..6372e4a8
--- /dev/null
+++ b/src/lib/generated/builders/raise-task-configuration-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { RaiseTaskConfigurationIntersection } from '../classes/raise-task-configuration';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.RaiseTaskConfiguration} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {RaiseTaskConfigurationIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.RaiseTaskConfiguration,
+  options: BuildOptions,
+): RaiseTaskConfigurationIntersection {
+  const instance = new Classes.RaiseTaskConfiguration(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as RaiseTaskConfigurationIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `RaiseTaskConfigurationIntersection`
+ * @returns {Builder} A builder for `RaiseTaskConfigurationIntersection`
+ */
+export const raiseTaskConfigurationBuilder = (
+  model?: Partial,
+): Builder, RaiseTaskConfigurationIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/raise-task-error-builder.ts b/src/lib/generated/builders/raise-task-error-builder.ts
new file mode 100644
index 00000000..2eda3158
--- /dev/null
+++ b/src/lib/generated/builders/raise-task-error-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { RaiseTaskErrorIntersection } from '../classes/raise-task-error';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.RaiseTaskError} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {RaiseTaskErrorIntersection} The built object
+ */
+function buildingFn(model: Specification.RaiseTaskError, options: BuildOptions): RaiseTaskErrorIntersection {
+  const instance = new Classes.RaiseTaskError(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as RaiseTaskErrorIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `RaiseTaskErrorIntersection`
+ * @returns {Builder} A builder for `RaiseTaskErrorIntersection`
+ */
+export const raiseTaskErrorBuilder = (
+  model?: Partial,
+): Builder, RaiseTaskErrorIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/referenceable-authentication-policy-builder.ts b/src/lib/generated/builders/referenceable-authentication-policy-builder.ts
new file mode 100644
index 00000000..203774bf
--- /dev/null
+++ b/src/lib/generated/builders/referenceable-authentication-policy-builder.ts
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ReferenceableAuthenticationPolicyIntersection } from '../classes/referenceable-authentication-policy';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ReferenceableAuthenticationPolicy} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ReferenceableAuthenticationPolicyIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.ReferenceableAuthenticationPolicy,
+  options: BuildOptions,
+): ReferenceableAuthenticationPolicyIntersection {
+  const instance = new Classes.ReferenceableAuthenticationPolicy(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ReferenceableAuthenticationPolicyIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ReferenceableAuthenticationPolicyIntersection`
+ * @returns {Builder} A builder for `ReferenceableAuthenticationPolicyIntersection`
+ */
+export const referenceableAuthenticationPolicyBuilder = (
+  model?: Partial,
+): Builder, ReferenceableAuthenticationPolicyIntersection> =>
+  builder(
+    model,
+    buildingFn,
+  );
diff --git a/src/lib/generated/builders/retry-backoff-builder.ts b/src/lib/generated/builders/retry-backoff-builder.ts
new file mode 100644
index 00000000..1ca7adad
--- /dev/null
+++ b/src/lib/generated/builders/retry-backoff-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { RetryBackoffIntersection } from '../classes/retry-backoff';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.RetryBackoff} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {RetryBackoffIntersection} The built object
+ */
+function buildingFn(model: Specification.RetryBackoff, options: BuildOptions): RetryBackoffIntersection {
+  const instance = new Classes.RetryBackoff(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as RetryBackoffIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `RetryBackoffIntersection`
+ * @returns {Builder} A builder for `RetryBackoffIntersection`
+ */
+export const retryBackoffBuilder = (
+  model?: Partial,
+): Builder, RetryBackoffIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/retry-limit-attempt-builder.ts b/src/lib/generated/builders/retry-limit-attempt-builder.ts
new file mode 100644
index 00000000..b43ed140
--- /dev/null
+++ b/src/lib/generated/builders/retry-limit-attempt-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { RetryLimitAttemptIntersection } from '../classes/retry-limit-attempt';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.RetryLimitAttempt} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {RetryLimitAttemptIntersection} The built object
+ */
+function buildingFn(model: Specification.RetryLimitAttempt, options: BuildOptions): RetryLimitAttemptIntersection {
+  const instance = new Classes.RetryLimitAttempt(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as RetryLimitAttemptIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `RetryLimitAttemptIntersection`
+ * @returns {Builder} A builder for `RetryLimitAttemptIntersection`
+ */
+export const retryLimitAttemptBuilder = (
+  model?: Partial,
+): Builder, RetryLimitAttemptIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/retry-limit-builder.ts b/src/lib/generated/builders/retry-limit-builder.ts
new file mode 100644
index 00000000..6e252eec
--- /dev/null
+++ b/src/lib/generated/builders/retry-limit-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { RetryLimitIntersection } from '../classes/retry-limit';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.RetryLimit} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {RetryLimitIntersection} The built object
+ */
+function buildingFn(model: Specification.RetryLimit, options: BuildOptions): RetryLimitIntersection {
+  const instance = new Classes.RetryLimit(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as RetryLimitIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `RetryLimitIntersection`
+ * @returns {Builder} A builder for `RetryLimitIntersection`
+ */
+export const retryLimitBuilder = (
+  model?: Partial,
+): Builder, RetryLimitIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/retry-policy-builder.ts b/src/lib/generated/builders/retry-policy-builder.ts
new file mode 100644
index 00000000..cecfe466
--- /dev/null
+++ b/src/lib/generated/builders/retry-policy-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { RetryPolicyIntersection } from '../classes/retry-policy';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.RetryPolicy} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {RetryPolicyIntersection} The built object
+ */
+function buildingFn(model: Specification.RetryPolicy, options: BuildOptions): RetryPolicyIntersection {
+  const instance = new Classes.RetryPolicy(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as RetryPolicyIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `RetryPolicyIntersection`
+ * @returns {Builder} A builder for `RetryPolicyIntersection`
+ */
+export const retryPolicyBuilder = (
+  model?: Partial,
+): Builder, RetryPolicyIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/retry-policy-jitter-builder.ts b/src/lib/generated/builders/retry-policy-jitter-builder.ts
new file mode 100644
index 00000000..46139ba7
--- /dev/null
+++ b/src/lib/generated/builders/retry-policy-jitter-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { RetryPolicyJitterIntersection } from '../classes/retry-policy-jitter';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.RetryPolicyJitter} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {RetryPolicyJitterIntersection} The built object
+ */
+function buildingFn(model: Specification.RetryPolicyJitter, options: BuildOptions): RetryPolicyJitterIntersection {
+  const instance = new Classes.RetryPolicyJitter(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as RetryPolicyJitterIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `RetryPolicyJitterIntersection`
+ * @returns {Builder} A builder for `RetryPolicyJitterIntersection`
+ */
+export const retryPolicyJitterBuilder = (
+  model?: Partial,
+): Builder, RetryPolicyJitterIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/run-container-builder.ts b/src/lib/generated/builders/run-container-builder.ts
new file mode 100644
index 00000000..8a28bf3a
--- /dev/null
+++ b/src/lib/generated/builders/run-container-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { RunContainerIntersection } from '../classes/run-container';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.RunContainer} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {RunContainerIntersection} The built object
+ */
+function buildingFn(model: Specification.RunContainer, options: BuildOptions): RunContainerIntersection {
+  const instance = new Classes.RunContainer(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as RunContainerIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `RunContainerIntersection`
+ * @returns {Builder} A builder for `RunContainerIntersection`
+ */
+export const runContainerBuilder = (
+  model?: Partial,
+): Builder, RunContainerIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/run-script-builder.ts b/src/lib/generated/builders/run-script-builder.ts
new file mode 100644
index 00000000..7d1be6ac
--- /dev/null
+++ b/src/lib/generated/builders/run-script-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { RunScriptIntersection } from '../classes/run-script';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.RunScript} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {RunScriptIntersection} The built object
+ */
+function buildingFn(model: Specification.RunScript, options: BuildOptions): RunScriptIntersection {
+  const instance = new Classes.RunScript(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as RunScriptIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `RunScriptIntersection`
+ * @returns {Builder} A builder for `RunScriptIntersection`
+ */
+export const runScriptBuilder = (
+  model?: Partial,
+): Builder, RunScriptIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/run-shell-builder.ts b/src/lib/generated/builders/run-shell-builder.ts
new file mode 100644
index 00000000..e35a66fd
--- /dev/null
+++ b/src/lib/generated/builders/run-shell-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { RunShellIntersection } from '../classes/run-shell';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.RunShell} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {RunShellIntersection} The built object
+ */
+function buildingFn(model: Specification.RunShell, options: BuildOptions): RunShellIntersection {
+  const instance = new Classes.RunShell(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as RunShellIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `RunShellIntersection`
+ * @returns {Builder} A builder for `RunShellIntersection`
+ */
+export const runShellBuilder = (
+  model?: Partial,
+): Builder, RunShellIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/run-task-builder.ts b/src/lib/generated/builders/run-task-builder.ts
new file mode 100644
index 00000000..833d3c65
--- /dev/null
+++ b/src/lib/generated/builders/run-task-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { RunTaskIntersection } from '../classes/run-task';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.RunTask} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {RunTaskIntersection} The built object
+ */
+function buildingFn(model: Specification.RunTask, options: BuildOptions): RunTaskIntersection {
+  const instance = new Classes.RunTask(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as RunTaskIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `RunTaskIntersection`
+ * @returns {Builder} A builder for `RunTaskIntersection`
+ */
+export const runTaskBuilder = (
+  model?: Partial,
+): Builder, RunTaskIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/run-task-configuration-builder.ts b/src/lib/generated/builders/run-task-configuration-builder.ts
new file mode 100644
index 00000000..b7b2b2e4
--- /dev/null
+++ b/src/lib/generated/builders/run-task-configuration-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { RunTaskConfigurationIntersection } from '../classes/run-task-configuration';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.RunTaskConfiguration} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {RunTaskConfigurationIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.RunTaskConfiguration,
+  options: BuildOptions,
+): RunTaskConfigurationIntersection {
+  const instance = new Classes.RunTaskConfiguration(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as RunTaskConfigurationIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `RunTaskConfigurationIntersection`
+ * @returns {Builder} A builder for `RunTaskConfigurationIntersection`
+ */
+export const runTaskConfigurationBuilder = (
+  model?: Partial,
+): Builder, RunTaskConfigurationIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/run-workflow-builder.ts b/src/lib/generated/builders/run-workflow-builder.ts
new file mode 100644
index 00000000..edb6b5ef
--- /dev/null
+++ b/src/lib/generated/builders/run-workflow-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { RunWorkflowIntersection } from '../classes/run-workflow';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.RunWorkflow} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {RunWorkflowIntersection} The built object
+ */
+function buildingFn(model: Specification.RunWorkflow, options: BuildOptions): RunWorkflowIntersection {
+  const instance = new Classes.RunWorkflow(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as RunWorkflowIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `RunWorkflowIntersection`
+ * @returns {Builder} A builder for `RunWorkflowIntersection`
+ */
+export const runWorkflowBuilder = (
+  model?: Partial,
+): Builder, RunWorkflowIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/runtime-expression-builder.ts b/src/lib/generated/builders/runtime-expression-builder.ts
new file mode 100644
index 00000000..e432ce11
--- /dev/null
+++ b/src/lib/generated/builders/runtime-expression-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { RuntimeExpressionIntersection } from '../classes/runtime-expression';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.RuntimeExpression} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {RuntimeExpressionIntersection} The built object
+ */
+function buildingFn(model: Specification.RuntimeExpression, options: BuildOptions): RuntimeExpressionIntersection {
+  const instance = new Classes.RuntimeExpression(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as RuntimeExpressionIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `RuntimeExpressionIntersection`
+ * @returns {Builder} A builder for `RuntimeExpressionIntersection`
+ */
+export const runtimeExpressionBuilder = (
+  model?: Partial,
+): Builder, RuntimeExpressionIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/schedule-builder.ts b/src/lib/generated/builders/schedule-builder.ts
new file mode 100644
index 00000000..2defa866
--- /dev/null
+++ b/src/lib/generated/builders/schedule-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ScheduleIntersection } from '../classes/schedule';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.Schedule} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ScheduleIntersection} The built object
+ */
+function buildingFn(model: Specification.Schedule, options: BuildOptions): ScheduleIntersection {
+  const instance = new Classes.Schedule(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ScheduleIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ScheduleIntersection`
+ * @returns {Builder} A builder for `ScheduleIntersection`
+ */
+export const scheduleBuilder = (
+  model?: Partial,
+): Builder, ScheduleIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/schema-builder.ts b/src/lib/generated/builders/schema-builder.ts
new file mode 100644
index 00000000..a72b6d95
--- /dev/null
+++ b/src/lib/generated/builders/schema-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { SchemaIntersection } from '../classes/schema';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.Schema} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {SchemaIntersection} The built object
+ */
+function buildingFn(model: Specification.Schema, options: BuildOptions): SchemaIntersection {
+  const instance = new Classes.Schema(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as SchemaIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `SchemaIntersection`
+ * @returns {Builder} A builder for `SchemaIntersection`
+ */
+export const schemaBuilder = (
+  model?: Partial,
+): Builder, SchemaIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/schema-external-builder.ts b/src/lib/generated/builders/schema-external-builder.ts
new file mode 100644
index 00000000..79697c64
--- /dev/null
+++ b/src/lib/generated/builders/schema-external-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { SchemaExternalIntersection } from '../classes/schema-external';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.SchemaExternal} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {SchemaExternalIntersection} The built object
+ */
+function buildingFn(model: Specification.SchemaExternal, options: BuildOptions): SchemaExternalIntersection {
+  const instance = new Classes.SchemaExternal(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as SchemaExternalIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `SchemaExternalIntersection`
+ * @returns {Builder} A builder for `SchemaExternalIntersection`
+ */
+export const schemaExternalBuilder = (
+  model?: Partial,
+): Builder, SchemaExternalIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/schema-inline-builder.ts b/src/lib/generated/builders/schema-inline-builder.ts
new file mode 100644
index 00000000..910bfb6a
--- /dev/null
+++ b/src/lib/generated/builders/schema-inline-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { SchemaInlineIntersection } from '../classes/schema-inline';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.SchemaInline} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {SchemaInlineIntersection} The built object
+ */
+function buildingFn(model: Specification.SchemaInline, options: BuildOptions): SchemaInlineIntersection {
+  const instance = new Classes.SchemaInline(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as SchemaInlineIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `SchemaInlineIntersection`
+ * @returns {Builder} A builder for `SchemaInlineIntersection`
+ */
+export const schemaInlineBuilder = (
+  model?: Partial,
+): Builder, SchemaInlineIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/script-builder.ts b/src/lib/generated/builders/script-builder.ts
new file mode 100644
index 00000000..d2d728ee
--- /dev/null
+++ b/src/lib/generated/builders/script-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ScriptIntersection } from '../classes/script';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.Script} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ScriptIntersection} The built object
+ */
+function buildingFn(model: Specification.Script, options: BuildOptions): ScriptIntersection {
+  const instance = new Classes.Script(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ScriptIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ScriptIntersection`
+ * @returns {Builder} A builder for `ScriptIntersection`
+ */
+export const scriptBuilder = (
+  model?: Partial,
+): Builder, ScriptIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/secret-based-authentication-policy-builder.ts b/src/lib/generated/builders/secret-based-authentication-policy-builder.ts
new file mode 100644
index 00000000..fac68704
--- /dev/null
+++ b/src/lib/generated/builders/secret-based-authentication-policy-builder.ts
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { SecretBasedAuthenticationPolicyIntersection } from '../classes/secret-based-authentication-policy';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.SecretBasedAuthenticationPolicy} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {SecretBasedAuthenticationPolicyIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.SecretBasedAuthenticationPolicy,
+  options: BuildOptions,
+): SecretBasedAuthenticationPolicyIntersection {
+  const instance = new Classes.SecretBasedAuthenticationPolicy(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as SecretBasedAuthenticationPolicyIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `SecretBasedAuthenticationPolicyIntersection`
+ * @returns {Builder} A builder for `SecretBasedAuthenticationPolicyIntersection`
+ */
+export const secretBasedAuthenticationPolicyBuilder = (
+  model?: Partial,
+): Builder, SecretBasedAuthenticationPolicyIntersection> =>
+  builder(
+    model,
+    buildingFn,
+  );
diff --git a/src/lib/generated/builders/set-task-builder.ts b/src/lib/generated/builders/set-task-builder.ts
new file mode 100644
index 00000000..a0895adf
--- /dev/null
+++ b/src/lib/generated/builders/set-task-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { SetTaskIntersection } from '../classes/set-task';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.SetTask} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {SetTaskIntersection} The built object
+ */
+function buildingFn(model: Specification.SetTask, options: BuildOptions): SetTaskIntersection {
+  const instance = new Classes.SetTask(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as SetTaskIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `SetTaskIntersection`
+ * @returns {Builder} A builder for `SetTaskIntersection`
+ */
+export const setTaskBuilder = (
+  model?: Partial,
+): Builder, SetTaskIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/set-task-configuration-builder.ts b/src/lib/generated/builders/set-task-configuration-builder.ts
new file mode 100644
index 00000000..77715dc4
--- /dev/null
+++ b/src/lib/generated/builders/set-task-configuration-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { SetTaskConfigurationIntersection } from '../classes/set-task-configuration';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.SetTaskConfiguration} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {SetTaskConfigurationIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.SetTaskConfiguration,
+  options: BuildOptions,
+): SetTaskConfigurationIntersection {
+  const instance = new Classes.SetTaskConfiguration(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as SetTaskConfigurationIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `SetTaskConfigurationIntersection`
+ * @returns {Builder} A builder for `SetTaskConfigurationIntersection`
+ */
+export const setTaskConfigurationBuilder = (
+  model?: Partial,
+): Builder, SetTaskConfigurationIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/shell-arguments-builder.ts b/src/lib/generated/builders/shell-arguments-builder.ts
new file mode 100644
index 00000000..4611cc22
--- /dev/null
+++ b/src/lib/generated/builders/shell-arguments-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ShellArgumentsIntersection } from '../classes/shell-arguments';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ShellArguments} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ShellArgumentsIntersection} The built object
+ */
+function buildingFn(model: Specification.ShellArguments, options: BuildOptions): ShellArgumentsIntersection {
+  const instance = new Classes.ShellArguments(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ShellArgumentsIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ShellArgumentsIntersection`
+ * @returns {Builder} A builder for `ShellArgumentsIntersection`
+ */
+export const shellArgumentsBuilder = (
+  model?: Partial,
+): Builder, ShellArgumentsIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/shell-builder.ts b/src/lib/generated/builders/shell-builder.ts
new file mode 100644
index 00000000..b9191143
--- /dev/null
+++ b/src/lib/generated/builders/shell-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ShellIntersection } from '../classes/shell';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.Shell} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ShellIntersection} The built object
+ */
+function buildingFn(model: Specification.Shell, options: BuildOptions): ShellIntersection {
+  const instance = new Classes.Shell(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ShellIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ShellIntersection`
+ * @returns {Builder} A builder for `ShellIntersection`
+ */
+export const shellBuilder = (
+  model?: Partial,
+): Builder, ShellIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/shell-environment-builder.ts b/src/lib/generated/builders/shell-environment-builder.ts
new file mode 100644
index 00000000..89ebc315
--- /dev/null
+++ b/src/lib/generated/builders/shell-environment-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { ShellEnvironmentIntersection } from '../classes/shell-environment';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.ShellEnvironment} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {ShellEnvironmentIntersection} The built object
+ */
+function buildingFn(model: Specification.ShellEnvironment, options: BuildOptions): ShellEnvironmentIntersection {
+  const instance = new Classes.ShellEnvironment(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as ShellEnvironmentIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `ShellEnvironmentIntersection`
+ * @returns {Builder} A builder for `ShellEnvironmentIntersection`
+ */
+export const shellEnvironmentBuilder = (
+  model?: Partial,
+): Builder, ShellEnvironmentIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/subflow-configuration-builder.ts b/src/lib/generated/builders/subflow-configuration-builder.ts
new file mode 100644
index 00000000..078997f9
--- /dev/null
+++ b/src/lib/generated/builders/subflow-configuration-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { SubflowConfigurationIntersection } from '../classes/subflow-configuration';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.SubflowConfiguration} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {SubflowConfigurationIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.SubflowConfiguration,
+  options: BuildOptions,
+): SubflowConfigurationIntersection {
+  const instance = new Classes.SubflowConfiguration(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as SubflowConfigurationIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `SubflowConfigurationIntersection`
+ * @returns {Builder} A builder for `SubflowConfigurationIntersection`
+ */
+export const subflowConfigurationBuilder = (
+  model?: Partial,
+): Builder, SubflowConfigurationIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/subflow-input-builder.ts b/src/lib/generated/builders/subflow-input-builder.ts
new file mode 100644
index 00000000..4551acab
--- /dev/null
+++ b/src/lib/generated/builders/subflow-input-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { SubflowInputIntersection } from '../classes/subflow-input';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.SubflowInput} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {SubflowInputIntersection} The built object
+ */
+function buildingFn(model: Specification.SubflowInput, options: BuildOptions): SubflowInputIntersection {
+  const instance = new Classes.SubflowInput(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as SubflowInputIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `SubflowInputIntersection`
+ * @returns {Builder} A builder for `SubflowInputIntersection`
+ */
+export const subflowInputBuilder = (
+  model?: Partial,
+): Builder, SubflowInputIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/subscription-iterator-builder.ts b/src/lib/generated/builders/subscription-iterator-builder.ts
new file mode 100644
index 00000000..ae138f99
--- /dev/null
+++ b/src/lib/generated/builders/subscription-iterator-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { SubscriptionIteratorIntersection } from '../classes/subscription-iterator';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.SubscriptionIterator} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {SubscriptionIteratorIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.SubscriptionIterator,
+  options: BuildOptions,
+): SubscriptionIteratorIntersection {
+  const instance = new Classes.SubscriptionIterator(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as SubscriptionIteratorIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `SubscriptionIteratorIntersection`
+ * @returns {Builder} A builder for `SubscriptionIteratorIntersection`
+ */
+export const subscriptionIteratorBuilder = (
+  model?: Partial,
+): Builder, SubscriptionIteratorIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/switch-case-builder.ts b/src/lib/generated/builders/switch-case-builder.ts
new file mode 100644
index 00000000..86dc28b6
--- /dev/null
+++ b/src/lib/generated/builders/switch-case-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { SwitchCaseIntersection } from '../classes/switch-case';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.SwitchCase} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {SwitchCaseIntersection} The built object
+ */
+function buildingFn(model: Specification.SwitchCase, options: BuildOptions): SwitchCaseIntersection {
+  const instance = new Classes.SwitchCase(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as SwitchCaseIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `SwitchCaseIntersection`
+ * @returns {Builder} A builder for `SwitchCaseIntersection`
+ */
+export const switchCaseBuilder = (
+  model?: Partial,
+): Builder, SwitchCaseIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/switch-item-builder.ts b/src/lib/generated/builders/switch-item-builder.ts
new file mode 100644
index 00000000..2935a6d8
--- /dev/null
+++ b/src/lib/generated/builders/switch-item-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { SwitchItemIntersection } from '../classes/switch-item';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.SwitchItem} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {SwitchItemIntersection} The built object
+ */
+function buildingFn(model: Specification.SwitchItem, options: BuildOptions): SwitchItemIntersection {
+  const instance = new Classes.SwitchItem(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as SwitchItemIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `SwitchItemIntersection`
+ * @returns {Builder} A builder for `SwitchItemIntersection`
+ */
+export const switchItemBuilder = (
+  model?: Partial,
+): Builder, SwitchItemIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/switch-task-builder.ts b/src/lib/generated/builders/switch-task-builder.ts
new file mode 100644
index 00000000..a60b0ce8
--- /dev/null
+++ b/src/lib/generated/builders/switch-task-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { SwitchTaskIntersection } from '../classes/switch-task';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.SwitchTask} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {SwitchTaskIntersection} The built object
+ */
+function buildingFn(model: Specification.SwitchTask, options: BuildOptions): SwitchTaskIntersection {
+  const instance = new Classes.SwitchTask(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as SwitchTaskIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `SwitchTaskIntersection`
+ * @returns {Builder} A builder for `SwitchTaskIntersection`
+ */
+export const switchTaskBuilder = (
+  model?: Partial,
+): Builder, SwitchTaskIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/switch-task-configuration-builder.ts b/src/lib/generated/builders/switch-task-configuration-builder.ts
new file mode 100644
index 00000000..e17975a1
--- /dev/null
+++ b/src/lib/generated/builders/switch-task-configuration-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { SwitchTaskConfigurationIntersection } from '../classes/switch-task-configuration';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.SwitchTaskConfiguration} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {SwitchTaskConfigurationIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.SwitchTaskConfiguration,
+  options: BuildOptions,
+): SwitchTaskConfigurationIntersection {
+  const instance = new Classes.SwitchTaskConfiguration(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as unknown as SwitchTaskConfigurationIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `SwitchTaskConfigurationIntersection`
+ * @returns {Builder} A builder for `SwitchTaskConfigurationIntersection`
+ */
+export const switchTaskConfigurationBuilder = (
+  model?: Partial,
+): Builder, SwitchTaskConfigurationIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/task-base-builder.ts b/src/lib/generated/builders/task-base-builder.ts
new file mode 100644
index 00000000..1896f262
--- /dev/null
+++ b/src/lib/generated/builders/task-base-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { TaskBaseIntersection } from '../classes/task-base';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.TaskBase} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {TaskBaseIntersection} The built object
+ */
+function buildingFn(model: Specification.TaskBase, options: BuildOptions): TaskBaseIntersection {
+  const instance = new Classes.TaskBase(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as TaskBaseIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `TaskBaseIntersection`
+ * @returns {Builder} A builder for `TaskBaseIntersection`
+ */
+export const taskBaseBuilder = (
+  model?: Partial,
+): Builder, TaskBaseIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/task-base-if-builder.ts b/src/lib/generated/builders/task-base-if-builder.ts
new file mode 100644
index 00000000..b4a5b037
--- /dev/null
+++ b/src/lib/generated/builders/task-base-if-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { TaskBaseIfIntersection } from '../classes/task-base-if';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.TaskBaseIf} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {TaskBaseIfIntersection} The built object
+ */
+function buildingFn(model: Specification.TaskBaseIf, options: BuildOptions): TaskBaseIfIntersection {
+  const instance = new Classes.TaskBaseIf(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as TaskBaseIfIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `TaskBaseIfIntersection`
+ * @returns {Builder} A builder for `TaskBaseIfIntersection`
+ */
+export const taskBaseIfBuilder = (
+  model?: Partial,
+): Builder, TaskBaseIfIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/task-builder.ts b/src/lib/generated/builders/task-builder.ts
new file mode 100644
index 00000000..c74aa8c9
--- /dev/null
+++ b/src/lib/generated/builders/task-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { TaskIntersection } from '../classes/task';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.Task} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {TaskIntersection} The built object
+ */
+function buildingFn(model: Specification.Task, options: BuildOptions): TaskIntersection {
+  const instance = new Classes.Task(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as TaskIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `TaskIntersection`
+ * @returns {Builder} A builder for `TaskIntersection`
+ */
+export const taskBuilder = (
+  model?: Partial,
+): Builder, TaskIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/task-item-builder.ts b/src/lib/generated/builders/task-item-builder.ts
new file mode 100644
index 00000000..5ee71592
--- /dev/null
+++ b/src/lib/generated/builders/task-item-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { TaskItemIntersection } from '../classes/task-item';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.TaskItem} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {TaskItemIntersection} The built object
+ */
+function buildingFn(model: Specification.TaskItem, options: BuildOptions): TaskItemIntersection {
+  const instance = new Classes.TaskItem(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as TaskItemIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `TaskItemIntersection`
+ * @returns {Builder} A builder for `TaskItemIntersection`
+ */
+export const taskItemBuilder = (
+  model?: Partial,
+): Builder, TaskItemIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/task-list-builder.ts b/src/lib/generated/builders/task-list-builder.ts
new file mode 100644
index 00000000..eb90ed3e
--- /dev/null
+++ b/src/lib/generated/builders/task-list-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { arrayBuilder, ArrayBuilder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { TaskListIntersection } from '../classes/task-list';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying array
+ * @param {Specification.TaskList} model The proxied array
+ * @param {BuildOptions} options The build options to use
+ * @returns {TaskListIntersection} The built array
+ */
+function buildingFn(model: Specification.TaskList, options: BuildOptions): TaskListIntersection {
+  const instance = new Classes.TaskList(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as unknown as TaskListIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `TaskListIntersection`
+ * @returns {ArrayBuilder} A builder for `TaskListIntersection`
+ */
+export const taskListBuilder = (
+  model?: Specification.TaskList,
+): ArrayBuilder =>
+  arrayBuilder(model, buildingFn);
diff --git a/src/lib/generated/builders/task-metadata-builder.ts b/src/lib/generated/builders/task-metadata-builder.ts
new file mode 100644
index 00000000..d9dc907d
--- /dev/null
+++ b/src/lib/generated/builders/task-metadata-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { TaskMetadataIntersection } from '../classes/task-metadata';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.TaskMetadata} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {TaskMetadataIntersection} The built object
+ */
+function buildingFn(model: Specification.TaskMetadata, options: BuildOptions): TaskMetadataIntersection {
+  const instance = new Classes.TaskMetadata(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as TaskMetadataIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `TaskMetadataIntersection`
+ * @returns {Builder} A builder for `TaskMetadataIntersection`
+ */
+export const taskMetadataBuilder = (
+  model?: Partial,
+): Builder, TaskMetadataIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/task-timeout-builder.ts b/src/lib/generated/builders/task-timeout-builder.ts
new file mode 100644
index 00000000..42401187
--- /dev/null
+++ b/src/lib/generated/builders/task-timeout-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { TaskTimeoutIntersection } from '../classes/task-timeout';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.TaskTimeout} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {TaskTimeoutIntersection} The built object
+ */
+function buildingFn(model: Specification.TaskTimeout, options: BuildOptions): TaskTimeoutIntersection {
+  const instance = new Classes.TaskTimeout(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as TaskTimeoutIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `TaskTimeoutIntersection`
+ * @returns {Builder} A builder for `TaskTimeoutIntersection`
+ */
+export const taskTimeoutBuilder = (
+  model?: Partial,
+): Builder, TaskTimeoutIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/timeout-builder.ts b/src/lib/generated/builders/timeout-builder.ts
new file mode 100644
index 00000000..d395c819
--- /dev/null
+++ b/src/lib/generated/builders/timeout-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { TimeoutIntersection } from '../classes/timeout';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.Timeout} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {TimeoutIntersection} The built object
+ */
+function buildingFn(model: Specification.Timeout, options: BuildOptions): TimeoutIntersection {
+  const instance = new Classes.Timeout(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as TimeoutIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `TimeoutIntersection`
+ * @returns {Builder} A builder for `TimeoutIntersection`
+ */
+export const timeoutBuilder = (
+  model?: Partial,
+): Builder, TimeoutIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/try-task-builder.ts b/src/lib/generated/builders/try-task-builder.ts
new file mode 100644
index 00000000..0a977db6
--- /dev/null
+++ b/src/lib/generated/builders/try-task-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { TryTaskIntersection } from '../classes/try-task';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.TryTask} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {TryTaskIntersection} The built object
+ */
+function buildingFn(model: Specification.TryTask, options: BuildOptions): TryTaskIntersection {
+  const instance = new Classes.TryTask(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as TryTaskIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `TryTaskIntersection`
+ * @returns {Builder} A builder for `TryTaskIntersection`
+ */
+export const tryTaskBuilder = (
+  model?: Partial,
+): Builder, TryTaskIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/try-task-catch-builder.ts b/src/lib/generated/builders/try-task-catch-builder.ts
new file mode 100644
index 00000000..2b534d7a
--- /dev/null
+++ b/src/lib/generated/builders/try-task-catch-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { TryTaskCatchIntersection } from '../classes/try-task-catch';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.TryTaskCatch} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {TryTaskCatchIntersection} The built object
+ */
+function buildingFn(model: Specification.TryTaskCatch, options: BuildOptions): TryTaskCatchIntersection {
+  const instance = new Classes.TryTaskCatch(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as TryTaskCatchIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `TryTaskCatchIntersection`
+ * @returns {Builder} A builder for `TryTaskCatchIntersection`
+ */
+export const tryTaskCatchBuilder = (
+  model?: Partial,
+): Builder, TryTaskCatchIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/try-task-catch-retry-builder.ts b/src/lib/generated/builders/try-task-catch-retry-builder.ts
new file mode 100644
index 00000000..0db8167b
--- /dev/null
+++ b/src/lib/generated/builders/try-task-catch-retry-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { TryTaskCatchRetryIntersection } from '../classes/try-task-catch-retry';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.TryTaskCatchRetry} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {TryTaskCatchRetryIntersection} The built object
+ */
+function buildingFn(model: Specification.TryTaskCatchRetry, options: BuildOptions): TryTaskCatchRetryIntersection {
+  const instance = new Classes.TryTaskCatchRetry(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as TryTaskCatchRetryIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `TryTaskCatchRetryIntersection`
+ * @returns {Builder} A builder for `TryTaskCatchRetryIntersection`
+ */
+export const tryTaskCatchRetryBuilder = (
+  model?: Partial,
+): Builder, TryTaskCatchRetryIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/uri-template-builder.ts b/src/lib/generated/builders/uri-template-builder.ts
new file mode 100644
index 00000000..ec5713fb
--- /dev/null
+++ b/src/lib/generated/builders/uri-template-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { UriTemplateIntersection } from '../classes/uri-template';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.UriTemplate} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {UriTemplateIntersection} The built object
+ */
+function buildingFn(model: Specification.UriTemplate, options: BuildOptions): UriTemplateIntersection {
+  const instance = new Classes.UriTemplate(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as UriTemplateIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `UriTemplateIntersection`
+ * @returns {Builder} A builder for `UriTemplateIntersection`
+ */
+export const uriTemplateBuilder = (
+  model?: Partial,
+): Builder, UriTemplateIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/use-authentications-builder.ts b/src/lib/generated/builders/use-authentications-builder.ts
new file mode 100644
index 00000000..0c224bbc
--- /dev/null
+++ b/src/lib/generated/builders/use-authentications-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { UseAuthenticationsIntersection } from '../classes/use-authentications';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.UseAuthentications} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {UseAuthenticationsIntersection} The built object
+ */
+function buildingFn(model: Specification.UseAuthentications, options: BuildOptions): UseAuthenticationsIntersection {
+  const instance = new Classes.UseAuthentications(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as UseAuthenticationsIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `UseAuthenticationsIntersection`
+ * @returns {Builder} A builder for `UseAuthenticationsIntersection`
+ */
+export const useAuthenticationsBuilder = (
+  model?: Partial,
+): Builder, UseAuthenticationsIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/use-builder.ts b/src/lib/generated/builders/use-builder.ts
new file mode 100644
index 00000000..32c748dd
--- /dev/null
+++ b/src/lib/generated/builders/use-builder.ts
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { UseIntersection } from '../classes/use';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.Use} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {UseIntersection} The built object
+ */
+function buildingFn(model: Specification.Use, options: BuildOptions): UseIntersection {
+  const instance = new Classes.Use(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as UseIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `UseIntersection`
+ * @returns {Builder} A builder for `UseIntersection`
+ */
+export const useBuilder = (model?: Partial): Builder, UseIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/use-catalogs-builder.ts b/src/lib/generated/builders/use-catalogs-builder.ts
new file mode 100644
index 00000000..1e569e92
--- /dev/null
+++ b/src/lib/generated/builders/use-catalogs-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { UseCatalogsIntersection } from '../classes/use-catalogs';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.UseCatalogs} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {UseCatalogsIntersection} The built object
+ */
+function buildingFn(model: Specification.UseCatalogs, options: BuildOptions): UseCatalogsIntersection {
+  const instance = new Classes.UseCatalogs(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as UseCatalogsIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `UseCatalogsIntersection`
+ * @returns {Builder} A builder for `UseCatalogsIntersection`
+ */
+export const useCatalogsBuilder = (
+  model?: Partial,
+): Builder, UseCatalogsIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/use-errors-builder.ts b/src/lib/generated/builders/use-errors-builder.ts
new file mode 100644
index 00000000..59ebec2b
--- /dev/null
+++ b/src/lib/generated/builders/use-errors-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { UseErrorsIntersection } from '../classes/use-errors';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.UseErrors} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {UseErrorsIntersection} The built object
+ */
+function buildingFn(model: Specification.UseErrors, options: BuildOptions): UseErrorsIntersection {
+  const instance = new Classes.UseErrors(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as UseErrorsIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `UseErrorsIntersection`
+ * @returns {Builder} A builder for `UseErrorsIntersection`
+ */
+export const useErrorsBuilder = (
+  model?: Partial,
+): Builder, UseErrorsIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/use-extensions-builder.ts b/src/lib/generated/builders/use-extensions-builder.ts
new file mode 100644
index 00000000..a58eba58
--- /dev/null
+++ b/src/lib/generated/builders/use-extensions-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { arrayBuilder, ArrayBuilder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { UseExtensionsIntersection } from '../classes/use-extensions';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying array
+ * @param {Specification.UseExtensions} model The proxied array
+ * @param {BuildOptions} options The build options to use
+ * @returns {UseExtensionsIntersection} The built array
+ */
+function buildingFn(model: Specification.UseExtensions, options: BuildOptions): UseExtensionsIntersection {
+  const instance = new Classes.UseExtensions(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as unknown as UseExtensionsIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `UseExtensionsIntersection`
+ * @returns {ArrayBuilder} A builder for `UseExtensionsIntersection`
+ */
+export const useExtensionsBuilder = (
+  model?: Specification.UseExtensions,
+): ArrayBuilder =>
+  arrayBuilder(model, buildingFn);
diff --git a/src/lib/generated/builders/use-functions-builder.ts b/src/lib/generated/builders/use-functions-builder.ts
new file mode 100644
index 00000000..4bd13998
--- /dev/null
+++ b/src/lib/generated/builders/use-functions-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { UseFunctionsIntersection } from '../classes/use-functions';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.UseFunctions} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {UseFunctionsIntersection} The built object
+ */
+function buildingFn(model: Specification.UseFunctions, options: BuildOptions): UseFunctionsIntersection {
+  const instance = new Classes.UseFunctions(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as UseFunctionsIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `UseFunctionsIntersection`
+ * @returns {Builder} A builder for `UseFunctionsIntersection`
+ */
+export const useFunctionsBuilder = (
+  model?: Partial,
+): Builder, UseFunctionsIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/use-retries-builder.ts b/src/lib/generated/builders/use-retries-builder.ts
new file mode 100644
index 00000000..2aea55b3
--- /dev/null
+++ b/src/lib/generated/builders/use-retries-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { UseRetriesIntersection } from '../classes/use-retries';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.UseRetries} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {UseRetriesIntersection} The built object
+ */
+function buildingFn(model: Specification.UseRetries, options: BuildOptions): UseRetriesIntersection {
+  const instance = new Classes.UseRetries(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as UseRetriesIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `UseRetriesIntersection`
+ * @returns {Builder} A builder for `UseRetriesIntersection`
+ */
+export const useRetriesBuilder = (
+  model?: Partial,
+): Builder, UseRetriesIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/use-secrets-builder.ts b/src/lib/generated/builders/use-secrets-builder.ts
new file mode 100644
index 00000000..432dd6f9
--- /dev/null
+++ b/src/lib/generated/builders/use-secrets-builder.ts
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { arrayBuilder, ArrayBuilder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { UseSecretsIntersection } from '../classes/use-secrets';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying array
+ * @param {Specification.UseSecrets} model The proxied array
+ * @param {BuildOptions} options The build options to use
+ * @returns {UseSecretsIntersection} The built array
+ */
+function buildingFn(model: Specification.UseSecrets, options: BuildOptions): UseSecretsIntersection {
+  const instance = new Classes.UseSecrets(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as unknown as UseSecretsIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `UseSecretsIntersection`
+ * @returns {ArrayBuilder} A builder for `UseSecretsIntersection`
+ */
+export const useSecretsBuilder = (model?: Specification.UseSecrets): ArrayBuilder =>
+  arrayBuilder(model, buildingFn);
diff --git a/src/lib/generated/builders/use-timeouts-builder.ts b/src/lib/generated/builders/use-timeouts-builder.ts
new file mode 100644
index 00000000..f15cd84b
--- /dev/null
+++ b/src/lib/generated/builders/use-timeouts-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { UseTimeoutsIntersection } from '../classes/use-timeouts';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.UseTimeouts} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {UseTimeoutsIntersection} The built object
+ */
+function buildingFn(model: Specification.UseTimeouts, options: BuildOptions): UseTimeoutsIntersection {
+  const instance = new Classes.UseTimeouts(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as UseTimeoutsIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `UseTimeoutsIntersection`
+ * @returns {Builder} A builder for `UseTimeoutsIntersection`
+ */
+export const useTimeoutsBuilder = (
+  model?: Partial,
+): Builder, UseTimeoutsIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/wait-task-builder.ts b/src/lib/generated/builders/wait-task-builder.ts
new file mode 100644
index 00000000..54e97138
--- /dev/null
+++ b/src/lib/generated/builders/wait-task-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { WaitTaskIntersection } from '../classes/wait-task';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.WaitTask} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {WaitTaskIntersection} The built object
+ */
+function buildingFn(model: Specification.WaitTask, options: BuildOptions): WaitTaskIntersection {
+  const instance = new Classes.WaitTask(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as WaitTaskIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `WaitTaskIntersection`
+ * @returns {Builder} A builder for `WaitTaskIntersection`
+ */
+export const waitTaskBuilder = (
+  model?: Partial,
+): Builder, WaitTaskIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/with-event-builder.ts b/src/lib/generated/builders/with-event-builder.ts
new file mode 100644
index 00000000..2037d6f4
--- /dev/null
+++ b/src/lib/generated/builders/with-event-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { WithEventIntersection } from '../classes/with-event';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.WithEvent} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {WithEventIntersection} The built object
+ */
+function buildingFn(model: Specification.WithEvent, options: BuildOptions): WithEventIntersection {
+  const instance = new Classes.WithEvent(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as WithEventIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `WithEventIntersection`
+ * @returns {Builder} A builder for `WithEventIntersection`
+ */
+export const withEventBuilder = (
+  model?: Partial,
+): Builder, WithEventIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/with-grpc-arguments-builder.ts b/src/lib/generated/builders/with-grpc-arguments-builder.ts
new file mode 100644
index 00000000..b865c715
--- /dev/null
+++ b/src/lib/generated/builders/with-grpc-arguments-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { WithGRPCArgumentsIntersection } from '../classes/with-grpc-arguments';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.WithGRPCArguments} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {WithGRPCArgumentsIntersection} The built object
+ */
+function buildingFn(model: Specification.WithGRPCArguments, options: BuildOptions): WithGRPCArgumentsIntersection {
+  const instance = new Classes.WithGRPCArguments(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as WithGRPCArgumentsIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `WithGRPCArgumentsIntersection`
+ * @returns {Builder} A builder for `WithGRPCArgumentsIntersection`
+ */
+export const withGRPCArgumentsBuilder = (
+  model?: Partial,
+): Builder, WithGRPCArgumentsIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/with-grpc-service-builder.ts b/src/lib/generated/builders/with-grpc-service-builder.ts
new file mode 100644
index 00000000..d4a890dd
--- /dev/null
+++ b/src/lib/generated/builders/with-grpc-service-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { WithGRPCServiceIntersection } from '../classes/with-grpc-service';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.WithGRPCService} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {WithGRPCServiceIntersection} The built object
+ */
+function buildingFn(model: Specification.WithGRPCService, options: BuildOptions): WithGRPCServiceIntersection {
+  const instance = new Classes.WithGRPCService(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as WithGRPCServiceIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `WithGRPCServiceIntersection`
+ * @returns {Builder} A builder for `WithGRPCServiceIntersection`
+ */
+export const withGRPCServiceBuilder = (
+  model?: Partial,
+): Builder, WithGRPCServiceIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/with-open-api-parameters-builder.ts b/src/lib/generated/builders/with-open-api-parameters-builder.ts
new file mode 100644
index 00000000..31567562
--- /dev/null
+++ b/src/lib/generated/builders/with-open-api-parameters-builder.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { WithOpenAPIParametersIntersection } from '../classes/with-open-api-parameters';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.WithOpenAPIParameters} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {WithOpenAPIParametersIntersection} The built object
+ */
+function buildingFn(
+  model: Specification.WithOpenAPIParameters,
+  options: BuildOptions,
+): WithOpenAPIParametersIntersection {
+  const instance = new Classes.WithOpenAPIParameters(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as WithOpenAPIParametersIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `WithOpenAPIParametersIntersection`
+ * @returns {Builder} A builder for `WithOpenAPIParametersIntersection`
+ */
+export const withOpenAPIParametersBuilder = (
+  model?: Partial,
+): Builder, WithOpenAPIParametersIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/workflow-builder.ts b/src/lib/generated/builders/workflow-builder.ts
new file mode 100644
index 00000000..cd5fc3db
--- /dev/null
+++ b/src/lib/generated/builders/workflow-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { WorkflowIntersection } from '../classes/workflow';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.Workflow} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {WorkflowIntersection} The built object
+ */
+function buildingFn(model: Specification.Workflow, options: BuildOptions): WorkflowIntersection {
+  const instance = new Classes.Workflow(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as WorkflowIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `WorkflowIntersection`
+ * @returns {Builder} A builder for `WorkflowIntersection`
+ */
+export const workflowBuilder = (
+  model?: Partial,
+): Builder, WorkflowIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/workflow-metadata-builder.ts b/src/lib/generated/builders/workflow-metadata-builder.ts
new file mode 100644
index 00000000..97c700cb
--- /dev/null
+++ b/src/lib/generated/builders/workflow-metadata-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { WorkflowMetadataIntersection } from '../classes/workflow-metadata';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.WorkflowMetadata} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {WorkflowMetadataIntersection} The built object
+ */
+function buildingFn(model: Specification.WorkflowMetadata, options: BuildOptions): WorkflowMetadataIntersection {
+  const instance = new Classes.WorkflowMetadata(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as WorkflowMetadataIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `WorkflowMetadataIntersection`
+ * @returns {Builder} A builder for `WorkflowMetadataIntersection`
+ */
+export const workflowMetadataBuilder = (
+  model?: Partial,
+): Builder, WorkflowMetadataIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/workflow-tags-builder.ts b/src/lib/generated/builders/workflow-tags-builder.ts
new file mode 100644
index 00000000..d92aab29
--- /dev/null
+++ b/src/lib/generated/builders/workflow-tags-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { WorkflowTagsIntersection } from '../classes/workflow-tags';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.WorkflowTags} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {WorkflowTagsIntersection} The built object
+ */
+function buildingFn(model: Specification.WorkflowTags, options: BuildOptions): WorkflowTagsIntersection {
+  const instance = new Classes.WorkflowTags(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as WorkflowTagsIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `WorkflowTagsIntersection`
+ * @returns {Builder} A builder for `WorkflowTagsIntersection`
+ */
+export const workflowTagsBuilder = (
+  model?: Partial,
+): Builder, WorkflowTagsIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/generated/builders/workflow-timeout-builder.ts b/src/lib/generated/builders/workflow-timeout-builder.ts
new file mode 100644
index 00000000..dd084c3c
--- /dev/null
+++ b/src/lib/generated/builders/workflow-timeout-builder.ts
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { builder, Builder, BuildOptions } from '../../builder';
+import { Classes } from '../classes';
+import { WorkflowTimeoutIntersection } from '../classes/workflow-timeout';
+import { Specification } from '../definitions';
+
+/**
+ * The internal function used by the builder proxy to validate and return its underlying object
+ * @param {Specification.WorkflowTimeout} model The proxied object
+ * @param {BuildOptions} options The build options to use
+ * @returns {WorkflowTimeoutIntersection} The built object
+ */
+function buildingFn(model: Specification.WorkflowTimeout, options: BuildOptions): WorkflowTimeoutIntersection {
+  const instance = new Classes.WorkflowTimeout(model);
+  if (options.validate) instance.validate();
+  return (options.normalize ? instance.normalize() : instance) as WorkflowTimeoutIntersection;
+}
+
+/**
+ * A factory to create a builder proxy for the type `WorkflowTimeoutIntersection`
+ * @returns {Builder} A builder for `WorkflowTimeoutIntersection`
+ */
+export const workflowTimeoutBuilder = (
+  model?: Partial,
+): Builder, WorkflowTimeoutIntersection> =>
+  builder(model, buildingFn);
diff --git a/src/lib/schema/README.md b/src/lib/generated/classes/README.md
similarity index 100%
rename from src/lib/schema/README.md
rename to src/lib/generated/classes/README.md
diff --git a/src/lib/generated/classes/all-event-consumption-strategy-configuration.ts b/src/lib/generated/classes/all-event-consumption-strategy-configuration.ts
new file mode 100644
index 00000000..5a6c71a3
--- /dev/null
+++ b/src/lib/generated/classes/all-event-consumption-strategy-configuration.ts
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _EventFilter } from './event-filter';
+import { Specification } from '../definitions';
+import { ArrayHydrator } from '../../hydrator';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the AllEventConsumptionStrategyConfiguration class and type
+ */
+export type AllEventConsumptionStrategyConfigurationIntersection = AllEventConsumptionStrategyConfiguration &
+  Specification.AllEventConsumptionStrategyConfiguration;
+
+/**
+ * Represents a constructor for the intersection of the AllEventConsumptionStrategyConfiguration class and type
+ */
+export interface AllEventConsumptionStrategyConfigurationConstructor {
+  new (model?: Array | number): AllEventConsumptionStrategyConfigurationIntersection;
+}
+
+/**
+ * Represents a collection of Specification.EventFilter.
+ * Inherits from ArrayHydrator to handle array-specific hydration.
+ */
+export class AllEventConsumptionStrategyConfiguration extends ArrayHydrator {
+  /**
+   * Constructs a new instance of the AllEventConsumptionStrategyConfiguration class.
+   *
+   * @param model - Optional parameter which can be an array of objects or a number representing the array length.
+   */
+  constructor(model?: Array | number) {
+    super(model);
+    if (Array.isArray(model)) {
+      if (model?.length) {
+        this.splice(0, this.length);
+        model.forEach((item) => this.push(new _EventFilter(item)));
+      }
+    }
+    Object.setPrototypeOf(this, Object.create(AllEventConsumptionStrategyConfiguration.prototype));
+    getLifecycleHooks('AllEventConsumptionStrategyConfiguration')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the AllEventConsumptionStrategyConfiguration.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new AllEventConsumptionStrategyConfiguration(this);
+    validate('AllEventConsumptionStrategyConfiguration', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the AllEventConsumptionStrategyConfiguration.
+   * Creates a copy of the AllEventConsumptionStrategyConfiguration, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the AllEventConsumptionStrategyConfiguration instance.
+   */
+  normalize(): AllEventConsumptionStrategyConfiguration {
+    const copy = new AllEventConsumptionStrategyConfiguration(this);
+    return getLifecycleHooks('AllEventConsumptionStrategyConfiguration')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _AllEventConsumptionStrategyConfiguration =
+  AllEventConsumptionStrategyConfiguration as unknown as AllEventConsumptionStrategyConfigurationConstructor;
+//export const _AllEventConsumptionStrategyConfiguration = AllEventConsumptionStrategyConfiguration; // could be exported directly, but it makes the job of building the index more straightforward as it's consistant with "object" classes
diff --git a/src/lib/generated/classes/all-event-consumption-strategy.ts b/src/lib/generated/classes/all-event-consumption-strategy.ts
new file mode 100644
index 00000000..028ca07a
--- /dev/null
+++ b/src/lib/generated/classes/all-event-consumption-strategy.ts
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _AllEventConsumptionStrategyConfiguration } from './all-event-consumption-strategy-configuration';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the AllEventConsumptionStrategy class and type
+ */
+export type AllEventConsumptionStrategyIntersection = AllEventConsumptionStrategy &
+  Specification.AllEventConsumptionStrategy;
+
+/**
+ * Represents a constructor for the intersection of the AllEventConsumptionStrategy class and type
+ */
+export interface AllEventConsumptionStrategyConstructor {
+  new (model?: Partial): AllEventConsumptionStrategyIntersection;
+}
+
+/**
+ * Represents a AllEventConsumptionStrategy with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class AllEventConsumptionStrategy extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the AllEventConsumptionStrategy class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the AllEventConsumptionStrategy.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.AllEventConsumptionStrategy & object;
+    if (isObject(model)) {
+      if (typeof model.all === 'object') self.all = new _AllEventConsumptionStrategyConfiguration(model.all);
+    }
+    getLifecycleHooks('AllEventConsumptionStrategy')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the AllEventConsumptionStrategy.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new AllEventConsumptionStrategy(this as any) as AllEventConsumptionStrategyIntersection;
+    validate('AllEventConsumptionStrategy', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the AllEventConsumptionStrategy.
+   * Creates a copy of the AllEventConsumptionStrategy, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the AllEventConsumptionStrategy instance.
+   */
+  normalize(): AllEventConsumptionStrategy & Specification.AllEventConsumptionStrategy {
+    const copy = new AllEventConsumptionStrategy(this as any) as AllEventConsumptionStrategyIntersection;
+    return getLifecycleHooks('AllEventConsumptionStrategy')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _AllEventConsumptionStrategy = AllEventConsumptionStrategy as AllEventConsumptionStrategyConstructor;
diff --git a/src/lib/generated/classes/any-event-consumption-strategy-configuration.ts b/src/lib/generated/classes/any-event-consumption-strategy-configuration.ts
new file mode 100644
index 00000000..15a5bb16
--- /dev/null
+++ b/src/lib/generated/classes/any-event-consumption-strategy-configuration.ts
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _EventFilter } from './event-filter';
+import { Specification } from '../definitions';
+import { ArrayHydrator } from '../../hydrator';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the AnyEventConsumptionStrategyConfiguration class and type
+ */
+export type AnyEventConsumptionStrategyConfigurationIntersection = AnyEventConsumptionStrategyConfiguration &
+  Specification.AnyEventConsumptionStrategyConfiguration;
+
+/**
+ * Represents a constructor for the intersection of the AnyEventConsumptionStrategyConfiguration class and type
+ */
+export interface AnyEventConsumptionStrategyConfigurationConstructor {
+  new (model?: Array | number): AnyEventConsumptionStrategyConfigurationIntersection;
+}
+
+/**
+ * Represents a collection of Specification.EventFilter.
+ * Inherits from ArrayHydrator to handle array-specific hydration.
+ */
+export class AnyEventConsumptionStrategyConfiguration extends ArrayHydrator {
+  /**
+   * Constructs a new instance of the AnyEventConsumptionStrategyConfiguration class.
+   *
+   * @param model - Optional parameter which can be an array of objects or a number representing the array length.
+   */
+  constructor(model?: Array | number) {
+    super(model);
+    if (Array.isArray(model)) {
+      if (model?.length) {
+        this.splice(0, this.length);
+        model.forEach((item) => this.push(new _EventFilter(item)));
+      }
+    }
+    Object.setPrototypeOf(this, Object.create(AnyEventConsumptionStrategyConfiguration.prototype));
+    getLifecycleHooks('AnyEventConsumptionStrategyConfiguration')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the AnyEventConsumptionStrategyConfiguration.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new AnyEventConsumptionStrategyConfiguration(this);
+    validate('AnyEventConsumptionStrategyConfiguration', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the AnyEventConsumptionStrategyConfiguration.
+   * Creates a copy of the AnyEventConsumptionStrategyConfiguration, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the AnyEventConsumptionStrategyConfiguration instance.
+   */
+  normalize(): AnyEventConsumptionStrategyConfiguration {
+    const copy = new AnyEventConsumptionStrategyConfiguration(this);
+    return getLifecycleHooks('AnyEventConsumptionStrategyConfiguration')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _AnyEventConsumptionStrategyConfiguration =
+  AnyEventConsumptionStrategyConfiguration as unknown as AnyEventConsumptionStrategyConfigurationConstructor;
+//export const _AnyEventConsumptionStrategyConfiguration = AnyEventConsumptionStrategyConfiguration; // could be exported directly, but it makes the job of building the index more straightforward as it's consistant with "object" classes
diff --git a/src/lib/generated/classes/any-event-consumption-strategy-until.ts b/src/lib/generated/classes/any-event-consumption-strategy-until.ts
new file mode 100644
index 00000000..7174b313
--- /dev/null
+++ b/src/lib/generated/classes/any-event-consumption-strategy-until.ts
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _AllEventConsumptionStrategyConfiguration } from './all-event-consumption-strategy-configuration';
+import { _AnyEventConsumptionStrategyConfiguration } from './any-event-consumption-strategy-configuration';
+import { _EventFilter } from './event-filter';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the AnyEventConsumptionStrategyUntil class and type
+ */
+export type AnyEventConsumptionStrategyUntilIntersection = AnyEventConsumptionStrategyUntil &
+  Specification.AnyEventConsumptionStrategyUntil;
+
+/**
+ * Represents a constructor for the intersection of the AnyEventConsumptionStrategyUntil class and type
+ */
+export interface AnyEventConsumptionStrategyUntilConstructor {
+  new (model?: Partial): AnyEventConsumptionStrategyUntilIntersection;
+}
+
+/**
+ * Represents a AnyEventConsumptionStrategyUntil with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class AnyEventConsumptionStrategyUntil extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the AnyEventConsumptionStrategyUntil class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the AnyEventConsumptionStrategyUntil.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.AnyEventConsumptionStrategyUntil & object;
+    if (isObject(model)) {
+      if (typeof (model as Specification.AllEventConsumptionStrategy).all === 'object')
+        (self as Specification.AllEventConsumptionStrategy).all = new _AllEventConsumptionStrategyConfiguration(
+          (model as Specification.AllEventConsumptionStrategy)
+            .all as Specification.AllEventConsumptionStrategyConfiguration,
+        );
+      if (typeof (model as Specification.AnyEventConsumptionStrategy).any === 'object')
+        (self as Specification.AnyEventConsumptionStrategy).any = new _AnyEventConsumptionStrategyConfiguration(
+          (model as Specification.AnyEventConsumptionStrategy)
+            .any as Specification.AnyEventConsumptionStrategyConfiguration,
+        );
+      if (typeof (model as Specification.OneEventConsumptionStrategy).one === 'object')
+        (self as Specification.OneEventConsumptionStrategy).one = new _EventFilter(
+          (model as Specification.OneEventConsumptionStrategy).one as Specification.EventFilter,
+        );
+    }
+    getLifecycleHooks('AnyEventConsumptionStrategyUntil')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the AnyEventConsumptionStrategyUntil.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new AnyEventConsumptionStrategyUntil(this as any) as AnyEventConsumptionStrategyUntilIntersection;
+    validate('AnyEventConsumptionStrategyUntil', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the AnyEventConsumptionStrategyUntil.
+   * Creates a copy of the AnyEventConsumptionStrategyUntil, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the AnyEventConsumptionStrategyUntil instance.
+   */
+  normalize(): AnyEventConsumptionStrategyUntil & Specification.AnyEventConsumptionStrategyUntil {
+    const copy = new AnyEventConsumptionStrategyUntil(this as any) as AnyEventConsumptionStrategyUntilIntersection;
+    return getLifecycleHooks('AnyEventConsumptionStrategyUntil')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _AnyEventConsumptionStrategyUntil =
+  AnyEventConsumptionStrategyUntil as AnyEventConsumptionStrategyUntilConstructor;
diff --git a/src/lib/generated/classes/any-event-consumption-strategy.ts b/src/lib/generated/classes/any-event-consumption-strategy.ts
new file mode 100644
index 00000000..4ac4c400
--- /dev/null
+++ b/src/lib/generated/classes/any-event-consumption-strategy.ts
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _AnyEventConsumptionStrategyConfiguration } from './any-event-consumption-strategy-configuration';
+import { _AnyEventConsumptionStrategyUntil } from './any-event-consumption-strategy-until';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the AnyEventConsumptionStrategy class and type
+ */
+export type AnyEventConsumptionStrategyIntersection = AnyEventConsumptionStrategy &
+  Specification.AnyEventConsumptionStrategy;
+
+/**
+ * Represents a constructor for the intersection of the AnyEventConsumptionStrategy class and type
+ */
+export interface AnyEventConsumptionStrategyConstructor {
+  new (model?: Partial): AnyEventConsumptionStrategyIntersection;
+}
+
+/**
+ * Represents a AnyEventConsumptionStrategy with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class AnyEventConsumptionStrategy extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the AnyEventConsumptionStrategy class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the AnyEventConsumptionStrategy.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.AnyEventConsumptionStrategy & object;
+    if (isObject(model)) {
+      if (typeof model.any === 'object') self.any = new _AnyEventConsumptionStrategyConfiguration(model.any);
+      if (typeof model.until === 'object') self.until = new _AnyEventConsumptionStrategyUntil(model.until);
+    }
+    getLifecycleHooks('AnyEventConsumptionStrategy')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the AnyEventConsumptionStrategy.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new AnyEventConsumptionStrategy(this as any) as AnyEventConsumptionStrategyIntersection;
+    validate('AnyEventConsumptionStrategy', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the AnyEventConsumptionStrategy.
+   * Creates a copy of the AnyEventConsumptionStrategy, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the AnyEventConsumptionStrategy instance.
+   */
+  normalize(): AnyEventConsumptionStrategy & Specification.AnyEventConsumptionStrategy {
+    const copy = new AnyEventConsumptionStrategy(this as any) as AnyEventConsumptionStrategyIntersection;
+    return getLifecycleHooks('AnyEventConsumptionStrategy')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _AnyEventConsumptionStrategy = AnyEventConsumptionStrategy as AnyEventConsumptionStrategyConstructor;
diff --git a/src/lib/generated/classes/any-event-until-consumed.ts b/src/lib/generated/classes/any-event-until-consumed.ts
new file mode 100644
index 00000000..101c88d6
--- /dev/null
+++ b/src/lib/generated/classes/any-event-until-consumed.ts
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _AllEventConsumptionStrategyConfiguration } from './all-event-consumption-strategy-configuration';
+import { _AnyEventConsumptionStrategyConfiguration } from './any-event-consumption-strategy-configuration';
+import { _EventFilter } from './event-filter';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the AnyEventUntilConsumed class and type
+ */
+export type AnyEventUntilConsumedIntersection = AnyEventUntilConsumed & Specification.AnyEventUntilConsumed;
+
+/**
+ * Represents a constructor for the intersection of the AnyEventUntilConsumed class and type
+ */
+export interface AnyEventUntilConsumedConstructor {
+  new (model?: Partial): AnyEventUntilConsumedIntersection;
+}
+
+/**
+ * Represents a AnyEventUntilConsumed with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class AnyEventUntilConsumed extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the AnyEventUntilConsumed class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the AnyEventUntilConsumed.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.AnyEventUntilConsumed & object;
+    if (isObject(model)) {
+      if (typeof (model as Specification.AllEventConsumptionStrategy).all === 'object')
+        (self as Specification.AllEventConsumptionStrategy).all = new _AllEventConsumptionStrategyConfiguration(
+          (model as Specification.AllEventConsumptionStrategy)
+            .all as Specification.AllEventConsumptionStrategyConfiguration,
+        );
+      if (typeof (model as Specification.AnyEventConsumptionStrategy).any === 'object')
+        (self as Specification.AnyEventConsumptionStrategy).any = new _AnyEventConsumptionStrategyConfiguration(
+          (model as Specification.AnyEventConsumptionStrategy)
+            .any as Specification.AnyEventConsumptionStrategyConfiguration,
+        );
+      if (typeof (model as Specification.OneEventConsumptionStrategy).one === 'object')
+        (self as Specification.OneEventConsumptionStrategy).one = new _EventFilter(
+          (model as Specification.OneEventConsumptionStrategy).one as Specification.EventFilter,
+        );
+    }
+    getLifecycleHooks('AnyEventUntilConsumed')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the AnyEventUntilConsumed.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new AnyEventUntilConsumed(this as any) as AnyEventUntilConsumedIntersection;
+    validate('AnyEventUntilConsumed', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the AnyEventUntilConsumed.
+   * Creates a copy of the AnyEventUntilConsumed, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the AnyEventUntilConsumed instance.
+   */
+  normalize(): AnyEventUntilConsumed & Specification.AnyEventUntilConsumed {
+    const copy = new AnyEventUntilConsumed(this as any) as AnyEventUntilConsumedIntersection;
+    return getLifecycleHooks('AnyEventUntilConsumed')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _AnyEventUntilConsumed = AnyEventUntilConsumed as AnyEventUntilConsumedConstructor;
diff --git a/src/lib/generated/classes/async-api-arguments.ts b/src/lib/generated/classes/async-api-arguments.ts
new file mode 100644
index 00000000..e2e81046
--- /dev/null
+++ b/src/lib/generated/classes/async-api-arguments.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the AsyncApiArguments class and type
+ */
+export type AsyncApiArgumentsIntersection = AsyncApiArguments & Specification.AsyncApiArguments;
+
+/**
+ * Represents a constructor for the intersection of the AsyncApiArguments class and type
+ */
+export interface AsyncApiArgumentsConstructor {
+  new (model?: Partial): AsyncApiArgumentsIntersection;
+}
+
+/**
+ * Represents a AsyncApiArguments with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class AsyncApiArguments extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the AsyncApiArguments class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the AsyncApiArguments.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('AsyncApiArguments')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the AsyncApiArguments.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new AsyncApiArguments(this as any) as AsyncApiArgumentsIntersection;
+    validate('AsyncApiArguments', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the AsyncApiArguments.
+   * Creates a copy of the AsyncApiArguments, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the AsyncApiArguments instance.
+   */
+  normalize(): AsyncApiArguments & Specification.AsyncApiArguments {
+    const copy = new AsyncApiArguments(this as any) as AsyncApiArgumentsIntersection;
+    return getLifecycleHooks('AsyncApiArguments')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _AsyncApiArguments = AsyncApiArguments as AsyncApiArgumentsConstructor;
diff --git a/src/lib/generated/classes/authentication-policy-reference.ts b/src/lib/generated/classes/authentication-policy-reference.ts
new file mode 100644
index 00000000..45467770
--- /dev/null
+++ b/src/lib/generated/classes/authentication-policy-reference.ts
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the AuthenticationPolicyReference class and type
+ */
+export type AuthenticationPolicyReferenceIntersection = AuthenticationPolicyReference &
+  Specification.AuthenticationPolicyReference;
+
+/**
+ * Represents a constructor for the intersection of the AuthenticationPolicyReference class and type
+ */
+export interface AuthenticationPolicyReferenceConstructor {
+  new (model?: Partial): AuthenticationPolicyReferenceIntersection;
+}
+
+/**
+ * Represents a AuthenticationPolicyReference with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class AuthenticationPolicyReference extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the AuthenticationPolicyReference class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the AuthenticationPolicyReference.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('AuthenticationPolicyReference')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the AuthenticationPolicyReference.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new AuthenticationPolicyReference(this as any) as AuthenticationPolicyReferenceIntersection;
+    validate('AuthenticationPolicyReference', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the AuthenticationPolicyReference.
+   * Creates a copy of the AuthenticationPolicyReference, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the AuthenticationPolicyReference instance.
+   */
+  normalize(): AuthenticationPolicyReference & Specification.AuthenticationPolicyReference {
+    const copy = new AuthenticationPolicyReference(this as any) as AuthenticationPolicyReferenceIntersection;
+    return getLifecycleHooks('AuthenticationPolicyReference')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _AuthenticationPolicyReference = AuthenticationPolicyReference as AuthenticationPolicyReferenceConstructor;
diff --git a/src/lib/generated/classes/authentication-policy.ts b/src/lib/generated/classes/authentication-policy.ts
new file mode 100644
index 00000000..939df061
--- /dev/null
+++ b/src/lib/generated/classes/authentication-policy.ts
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _BasicAuthenticationPolicyConfiguration } from './basic-authentication-policy-configuration';
+import { _BearerAuthenticationPolicyConfiguration } from './bearer-authentication-policy-configuration';
+import { _DigestAuthenticationPolicyConfiguration } from './digest-authentication-policy-configuration';
+import { _OAuth2AuthenticationPolicyConfiguration } from './oauth2-authentication-policy-configuration';
+import { _OpenIdConnectAuthenticationPolicyConfiguration } from './open-id-connect-authentication-policy-configuration';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the AuthenticationPolicy class and type
+ */
+export type AuthenticationPolicyIntersection = AuthenticationPolicy & Specification.AuthenticationPolicy;
+
+/**
+ * Represents a constructor for the intersection of the AuthenticationPolicy class and type
+ */
+export interface AuthenticationPolicyConstructor {
+  new (model?: Partial): AuthenticationPolicyIntersection;
+}
+
+/**
+ * Represents a AuthenticationPolicy with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class AuthenticationPolicy extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the AuthenticationPolicy class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the AuthenticationPolicy.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.AuthenticationPolicy & object;
+    if (isObject(model)) {
+      if (typeof (model as Specification.BasicAuthenticationPolicy).basic === 'object')
+        (self as Specification.BasicAuthenticationPolicy).basic = new _BasicAuthenticationPolicyConfiguration(
+          (model as Specification.BasicAuthenticationPolicy)
+            .basic as Specification.BasicAuthenticationPolicyConfiguration,
+        );
+      if (typeof (model as Specification.BearerAuthenticationPolicy).bearer === 'object')
+        (self as Specification.BearerAuthenticationPolicy).bearer = new _BearerAuthenticationPolicyConfiguration(
+          (model as Specification.BearerAuthenticationPolicy)
+            .bearer as Specification.BearerAuthenticationPolicyConfiguration,
+        );
+      if (typeof (model as Specification.DigestAuthenticationPolicy).digest === 'object')
+        (self as Specification.DigestAuthenticationPolicy).digest = new _DigestAuthenticationPolicyConfiguration(
+          (model as Specification.DigestAuthenticationPolicy)
+            .digest as Specification.DigestAuthenticationPolicyConfiguration,
+        );
+      if (typeof (model as Specification.OAuth2AuthenticationPolicy).oauth2 === 'object')
+        (self as Specification.OAuth2AuthenticationPolicy).oauth2 = new _OAuth2AuthenticationPolicyConfiguration(
+          (model as Specification.OAuth2AuthenticationPolicy)
+            .oauth2 as Specification.OAuth2AuthenticationPolicyConfiguration,
+        );
+      if (typeof (model as Specification.OpenIdConnectAuthenticationPolicy).oidc === 'object')
+        (self as Specification.OpenIdConnectAuthenticationPolicy).oidc =
+          new _OpenIdConnectAuthenticationPolicyConfiguration(
+            (model as Specification.OpenIdConnectAuthenticationPolicy)
+              .oidc as Specification.OpenIdConnectAuthenticationPolicyConfiguration,
+          );
+    }
+    getLifecycleHooks('AuthenticationPolicy')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the AuthenticationPolicy.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new AuthenticationPolicy(this as any) as AuthenticationPolicyIntersection;
+    validate('AuthenticationPolicy', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the AuthenticationPolicy.
+   * Creates a copy of the AuthenticationPolicy, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the AuthenticationPolicy instance.
+   */
+  normalize(): AuthenticationPolicy & Specification.AuthenticationPolicy {
+    const copy = new AuthenticationPolicy(this as any) as AuthenticationPolicyIntersection;
+    return getLifecycleHooks('AuthenticationPolicy')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _AuthenticationPolicy = AuthenticationPolicy as AuthenticationPolicyConstructor;
diff --git a/src/lib/generated/classes/basic-authentication-policy-configuration.ts b/src/lib/generated/classes/basic-authentication-policy-configuration.ts
new file mode 100644
index 00000000..991e82de
--- /dev/null
+++ b/src/lib/generated/classes/basic-authentication-policy-configuration.ts
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the BasicAuthenticationPolicyConfiguration class and type
+ */
+export type BasicAuthenticationPolicyConfigurationIntersection = BasicAuthenticationPolicyConfiguration &
+  Specification.BasicAuthenticationPolicyConfiguration;
+
+/**
+ * Represents a constructor for the intersection of the BasicAuthenticationPolicyConfiguration class and type
+ */
+export interface BasicAuthenticationPolicyConfigurationConstructor {
+  new (
+    model?: Partial,
+  ): BasicAuthenticationPolicyConfigurationIntersection;
+}
+
+/**
+ * Represents a BasicAuthenticationPolicyConfiguration with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class BasicAuthenticationPolicyConfiguration extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the BasicAuthenticationPolicyConfiguration class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the BasicAuthenticationPolicyConfiguration.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('BasicAuthenticationPolicyConfiguration')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the BasicAuthenticationPolicyConfiguration.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new BasicAuthenticationPolicyConfiguration(
+      this as any,
+    ) as BasicAuthenticationPolicyConfigurationIntersection;
+    validate('BasicAuthenticationPolicyConfiguration', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the BasicAuthenticationPolicyConfiguration.
+   * Creates a copy of the BasicAuthenticationPolicyConfiguration, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the BasicAuthenticationPolicyConfiguration instance.
+   */
+  normalize(): BasicAuthenticationPolicyConfiguration & Specification.BasicAuthenticationPolicyConfiguration {
+    const copy = new BasicAuthenticationPolicyConfiguration(
+      this as any,
+    ) as BasicAuthenticationPolicyConfigurationIntersection;
+    return getLifecycleHooks('BasicAuthenticationPolicyConfiguration')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _BasicAuthenticationPolicyConfiguration =
+  BasicAuthenticationPolicyConfiguration as BasicAuthenticationPolicyConfigurationConstructor;
diff --git a/src/lib/generated/classes/basic-authentication-policy.ts b/src/lib/generated/classes/basic-authentication-policy.ts
new file mode 100644
index 00000000..932b1e0d
--- /dev/null
+++ b/src/lib/generated/classes/basic-authentication-policy.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _BasicAuthenticationPolicyConfiguration } from './basic-authentication-policy-configuration';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the BasicAuthenticationPolicy class and type
+ */
+export type BasicAuthenticationPolicyIntersection = BasicAuthenticationPolicy & Specification.BasicAuthenticationPolicy;
+
+/**
+ * Represents a constructor for the intersection of the BasicAuthenticationPolicy class and type
+ */
+export interface BasicAuthenticationPolicyConstructor {
+  new (model?: Partial): BasicAuthenticationPolicyIntersection;
+}
+
+/**
+ * Represents a BasicAuthenticationPolicy with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class BasicAuthenticationPolicy extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the BasicAuthenticationPolicy class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the BasicAuthenticationPolicy.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.BasicAuthenticationPolicy & object;
+    if (isObject(model)) {
+      if (typeof model.basic === 'object') self.basic = new _BasicAuthenticationPolicyConfiguration(model.basic);
+    }
+    getLifecycleHooks('BasicAuthenticationPolicy')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the BasicAuthenticationPolicy.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new BasicAuthenticationPolicy(this as any) as BasicAuthenticationPolicyIntersection;
+    validate('BasicAuthenticationPolicy', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the BasicAuthenticationPolicy.
+   * Creates a copy of the BasicAuthenticationPolicy, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the BasicAuthenticationPolicy instance.
+   */
+  normalize(): BasicAuthenticationPolicy & Specification.BasicAuthenticationPolicy {
+    const copy = new BasicAuthenticationPolicy(this as any) as BasicAuthenticationPolicyIntersection;
+    return getLifecycleHooks('BasicAuthenticationPolicy')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _BasicAuthenticationPolicy = BasicAuthenticationPolicy as BasicAuthenticationPolicyConstructor;
diff --git a/src/lib/generated/classes/basic-authentication-properties.ts b/src/lib/generated/classes/basic-authentication-properties.ts
new file mode 100644
index 00000000..32a740b0
--- /dev/null
+++ b/src/lib/generated/classes/basic-authentication-properties.ts
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the BasicAuthenticationProperties class and type
+ */
+export type BasicAuthenticationPropertiesIntersection = BasicAuthenticationProperties &
+  Specification.BasicAuthenticationProperties;
+
+/**
+ * Represents a constructor for the intersection of the BasicAuthenticationProperties class and type
+ */
+export interface BasicAuthenticationPropertiesConstructor {
+  new (model?: Partial): BasicAuthenticationPropertiesIntersection;
+}
+
+/**
+ * Represents a BasicAuthenticationProperties with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class BasicAuthenticationProperties extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the BasicAuthenticationProperties class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the BasicAuthenticationProperties.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('BasicAuthenticationProperties')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the BasicAuthenticationProperties.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new BasicAuthenticationProperties(this as any) as BasicAuthenticationPropertiesIntersection;
+    validate('BasicAuthenticationProperties', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the BasicAuthenticationProperties.
+   * Creates a copy of the BasicAuthenticationProperties, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the BasicAuthenticationProperties instance.
+   */
+  normalize(): BasicAuthenticationProperties & Specification.BasicAuthenticationProperties {
+    const copy = new BasicAuthenticationProperties(this as any) as BasicAuthenticationPropertiesIntersection;
+    return getLifecycleHooks('BasicAuthenticationProperties')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _BasicAuthenticationProperties = BasicAuthenticationProperties as BasicAuthenticationPropertiesConstructor;
diff --git a/src/lib/generated/classes/bearer-authentication-policy-configuration.ts b/src/lib/generated/classes/bearer-authentication-policy-configuration.ts
new file mode 100644
index 00000000..a142b1ed
--- /dev/null
+++ b/src/lib/generated/classes/bearer-authentication-policy-configuration.ts
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the BearerAuthenticationPolicyConfiguration class and type
+ */
+export type BearerAuthenticationPolicyConfigurationIntersection = BearerAuthenticationPolicyConfiguration &
+  Specification.BearerAuthenticationPolicyConfiguration;
+
+/**
+ * Represents a constructor for the intersection of the BearerAuthenticationPolicyConfiguration class and type
+ */
+export interface BearerAuthenticationPolicyConfigurationConstructor {
+  new (
+    model?: Partial,
+  ): BearerAuthenticationPolicyConfigurationIntersection;
+}
+
+/**
+ * Represents a BearerAuthenticationPolicyConfiguration with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class BearerAuthenticationPolicyConfiguration extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the BearerAuthenticationPolicyConfiguration class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the BearerAuthenticationPolicyConfiguration.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('BearerAuthenticationPolicyConfiguration')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the BearerAuthenticationPolicyConfiguration.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new BearerAuthenticationPolicyConfiguration(
+      this as any,
+    ) as BearerAuthenticationPolicyConfigurationIntersection;
+    validate('BearerAuthenticationPolicyConfiguration', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the BearerAuthenticationPolicyConfiguration.
+   * Creates a copy of the BearerAuthenticationPolicyConfiguration, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the BearerAuthenticationPolicyConfiguration instance.
+   */
+  normalize(): BearerAuthenticationPolicyConfiguration & Specification.BearerAuthenticationPolicyConfiguration {
+    const copy = new BearerAuthenticationPolicyConfiguration(
+      this as any,
+    ) as BearerAuthenticationPolicyConfigurationIntersection;
+    return getLifecycleHooks('BearerAuthenticationPolicyConfiguration')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _BearerAuthenticationPolicyConfiguration =
+  BearerAuthenticationPolicyConfiguration as BearerAuthenticationPolicyConfigurationConstructor;
diff --git a/src/lib/generated/classes/bearer-authentication-policy.ts b/src/lib/generated/classes/bearer-authentication-policy.ts
new file mode 100644
index 00000000..0cf59409
--- /dev/null
+++ b/src/lib/generated/classes/bearer-authentication-policy.ts
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _BearerAuthenticationPolicyConfiguration } from './bearer-authentication-policy-configuration';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the BearerAuthenticationPolicy class and type
+ */
+export type BearerAuthenticationPolicyIntersection = BearerAuthenticationPolicy &
+  Specification.BearerAuthenticationPolicy;
+
+/**
+ * Represents a constructor for the intersection of the BearerAuthenticationPolicy class and type
+ */
+export interface BearerAuthenticationPolicyConstructor {
+  new (model?: Partial): BearerAuthenticationPolicyIntersection;
+}
+
+/**
+ * Represents a BearerAuthenticationPolicy with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class BearerAuthenticationPolicy extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the BearerAuthenticationPolicy class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the BearerAuthenticationPolicy.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.BearerAuthenticationPolicy & object;
+    if (isObject(model)) {
+      if (typeof model.bearer === 'object') self.bearer = new _BearerAuthenticationPolicyConfiguration(model.bearer);
+    }
+    getLifecycleHooks('BearerAuthenticationPolicy')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the BearerAuthenticationPolicy.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new BearerAuthenticationPolicy(this as any) as BearerAuthenticationPolicyIntersection;
+    validate('BearerAuthenticationPolicy', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the BearerAuthenticationPolicy.
+   * Creates a copy of the BearerAuthenticationPolicy, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the BearerAuthenticationPolicy instance.
+   */
+  normalize(): BearerAuthenticationPolicy & Specification.BearerAuthenticationPolicy {
+    const copy = new BearerAuthenticationPolicy(this as any) as BearerAuthenticationPolicyIntersection;
+    return getLifecycleHooks('BearerAuthenticationPolicy')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _BearerAuthenticationPolicy = BearerAuthenticationPolicy as BearerAuthenticationPolicyConstructor;
diff --git a/src/lib/generated/classes/bearer-authentication-properties.ts b/src/lib/generated/classes/bearer-authentication-properties.ts
new file mode 100644
index 00000000..6283395b
--- /dev/null
+++ b/src/lib/generated/classes/bearer-authentication-properties.ts
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the BearerAuthenticationProperties class and type
+ */
+export type BearerAuthenticationPropertiesIntersection = BearerAuthenticationProperties &
+  Specification.BearerAuthenticationProperties;
+
+/**
+ * Represents a constructor for the intersection of the BearerAuthenticationProperties class and type
+ */
+export interface BearerAuthenticationPropertiesConstructor {
+  new (model?: Partial): BearerAuthenticationPropertiesIntersection;
+}
+
+/**
+ * Represents a BearerAuthenticationProperties with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class BearerAuthenticationProperties extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the BearerAuthenticationProperties class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the BearerAuthenticationProperties.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('BearerAuthenticationProperties')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the BearerAuthenticationProperties.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new BearerAuthenticationProperties(this as any) as BearerAuthenticationPropertiesIntersection;
+    validate('BearerAuthenticationProperties', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the BearerAuthenticationProperties.
+   * Creates a copy of the BearerAuthenticationProperties, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the BearerAuthenticationProperties instance.
+   */
+  normalize(): BearerAuthenticationProperties & Specification.BearerAuthenticationProperties {
+    const copy = new BearerAuthenticationProperties(this as any) as BearerAuthenticationPropertiesIntersection;
+    return getLifecycleHooks('BearerAuthenticationProperties')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _BearerAuthenticationProperties =
+  BearerAuthenticationProperties as BearerAuthenticationPropertiesConstructor;
diff --git a/src/lib/generated/classes/call-async-api.ts b/src/lib/generated/classes/call-async-api.ts
new file mode 100644
index 00000000..ddb1f001
--- /dev/null
+++ b/src/lib/generated/classes/call-async-api.ts
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Input } from './input';
+import { _Output } from './output';
+import { _Export } from './export';
+import { _TaskTimeout } from './task-timeout';
+import { _TaskMetadata } from './task-metadata';
+import { _TaskBase } from './task-base';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the CallAsyncAPI class and type
+ */
+export type CallAsyncAPIIntersection = CallAsyncAPI & Specification.CallAsyncAPI;
+
+/**
+ * Represents a constructor for the intersection of the CallAsyncAPI class and type
+ */
+export interface CallAsyncAPIConstructor {
+  new (model?: Partial): CallAsyncAPIIntersection;
+}
+
+/**
+ * Represents a CallAsyncAPI with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class CallAsyncAPI extends _TaskBase {
+  /**
+   * Instanciates a new instance of the CallAsyncAPI class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the CallAsyncAPI.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.CallAsyncAPI & object;
+    if (isObject(model)) {
+      self.call = 'asyncapi' as const;
+      if (typeof model.input === 'object') self.input = new _Input(model.input);
+      if (typeof model.output === 'object') self.output = new _Output(model.output);
+      if (typeof model.export === 'object') self.export = new _Export(model.export);
+      if (typeof model.timeout === 'object') self.timeout = new _TaskTimeout(model.timeout);
+      if (typeof model.metadata === 'object') self.metadata = new _TaskMetadata(model.metadata);
+    }
+    getLifecycleHooks('CallAsyncAPI')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the CallAsyncAPI.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new CallAsyncAPI(this as any) as CallAsyncAPIIntersection;
+    validate('CallAsyncAPI', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the CallAsyncAPI.
+   * Creates a copy of the CallAsyncAPI, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the CallAsyncAPI instance.
+   */
+  normalize(): CallAsyncAPI & Specification.CallAsyncAPI {
+    const copy = new CallAsyncAPI(this as any) as CallAsyncAPIIntersection;
+    return getLifecycleHooks('CallAsyncAPI')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _CallAsyncAPI = CallAsyncAPI as CallAsyncAPIConstructor;
diff --git a/src/lib/generated/classes/call-function.ts b/src/lib/generated/classes/call-function.ts
new file mode 100644
index 00000000..df6583e1
--- /dev/null
+++ b/src/lib/generated/classes/call-function.ts
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Input } from './input';
+import { _Output } from './output';
+import { _Export } from './export';
+import { _TaskTimeout } from './task-timeout';
+import { _TaskMetadata } from './task-metadata';
+import { _FunctionArguments } from './function-arguments';
+import { _TaskBase } from './task-base';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the CallFunction class and type
+ */
+export type CallFunctionIntersection = CallFunction & Specification.CallFunction;
+
+/**
+ * Represents a constructor for the intersection of the CallFunction class and type
+ */
+export interface CallFunctionConstructor {
+  new (model?: Partial): CallFunctionIntersection;
+}
+
+/**
+ * Represents a CallFunction with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class CallFunction extends _TaskBase {
+  /**
+   * Instanciates a new instance of the CallFunction class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the CallFunction.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.CallFunction & object;
+    if (isObject(model)) {
+      if (typeof model.input === 'object') self.input = new _Input(model.input);
+      if (typeof model.output === 'object') self.output = new _Output(model.output);
+      if (typeof model.export === 'object') self.export = new _Export(model.export);
+      if (typeof model.timeout === 'object') self.timeout = new _TaskTimeout(model.timeout);
+      if (typeof model.metadata === 'object') self.metadata = new _TaskMetadata(model.metadata);
+      if (typeof model.with === 'object') self.with = new _FunctionArguments(model.with);
+    }
+    getLifecycleHooks('CallFunction')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the CallFunction.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new CallFunction(this as any) as CallFunctionIntersection;
+    validate('CallFunction', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the CallFunction.
+   * Creates a copy of the CallFunction, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the CallFunction instance.
+   */
+  normalize(): CallFunction & Specification.CallFunction {
+    const copy = new CallFunction(this as any) as CallFunctionIntersection;
+    return getLifecycleHooks('CallFunction')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _CallFunction = CallFunction as CallFunctionConstructor;
diff --git a/src/lib/generated/classes/call-grpc.ts b/src/lib/generated/classes/call-grpc.ts
new file mode 100644
index 00000000..904d5fb7
--- /dev/null
+++ b/src/lib/generated/classes/call-grpc.ts
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Input } from './input';
+import { _Output } from './output';
+import { _Export } from './export';
+import { _TaskTimeout } from './task-timeout';
+import { _TaskMetadata } from './task-metadata';
+import { _GRPCArguments } from './grpc-arguments';
+import { _TaskBase } from './task-base';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the CallGRPC class and type
+ */
+export type CallGRPCIntersection = CallGRPC & Specification.CallGRPC;
+
+/**
+ * Represents a constructor for the intersection of the CallGRPC class and type
+ */
+export interface CallGRPCConstructor {
+  new (model?: Partial): CallGRPCIntersection;
+}
+
+/**
+ * Represents a CallGRPC with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class CallGRPC extends _TaskBase {
+  /**
+   * Instanciates a new instance of the CallGRPC class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the CallGRPC.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.CallGRPC & object;
+    if (isObject(model)) {
+      self.call = 'grpc' as const;
+      if (typeof model.input === 'object') self.input = new _Input(model.input);
+      if (typeof model.output === 'object') self.output = new _Output(model.output);
+      if (typeof model.export === 'object') self.export = new _Export(model.export);
+      if (typeof model.timeout === 'object') self.timeout = new _TaskTimeout(model.timeout);
+      if (typeof model.metadata === 'object') self.metadata = new _TaskMetadata(model.metadata);
+      if (typeof model.with === 'object') self.with = new _GRPCArguments(model.with);
+    }
+    getLifecycleHooks('CallGRPC')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the CallGRPC.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new CallGRPC(this as any) as CallGRPCIntersection;
+    validate('CallGRPC', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the CallGRPC.
+   * Creates a copy of the CallGRPC, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the CallGRPC instance.
+   */
+  normalize(): CallGRPC & Specification.CallGRPC {
+    const copy = new CallGRPC(this as any) as CallGRPCIntersection;
+    return getLifecycleHooks('CallGRPC')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _CallGRPC = CallGRPC as CallGRPCConstructor;
diff --git a/src/lib/generated/classes/call-http.ts b/src/lib/generated/classes/call-http.ts
new file mode 100644
index 00000000..45569819
--- /dev/null
+++ b/src/lib/generated/classes/call-http.ts
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Input } from './input';
+import { _Output } from './output';
+import { _Export } from './export';
+import { _TaskTimeout } from './task-timeout';
+import { _TaskMetadata } from './task-metadata';
+import { _HTTPArguments } from './http-arguments';
+import { _TaskBase } from './task-base';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the CallHTTP class and type
+ */
+export type CallHTTPIntersection = CallHTTP & Specification.CallHTTP;
+
+/**
+ * Represents a constructor for the intersection of the CallHTTP class and type
+ */
+export interface CallHTTPConstructor {
+  new (model?: Partial): CallHTTPIntersection;
+}
+
+/**
+ * Represents a CallHTTP with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class CallHTTP extends _TaskBase {
+  /**
+   * Instanciates a new instance of the CallHTTP class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the CallHTTP.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.CallHTTP & object;
+    if (isObject(model)) {
+      self.call = 'http' as const;
+      if (typeof model.input === 'object') self.input = new _Input(model.input);
+      if (typeof model.output === 'object') self.output = new _Output(model.output);
+      if (typeof model.export === 'object') self.export = new _Export(model.export);
+      if (typeof model.timeout === 'object') self.timeout = new _TaskTimeout(model.timeout);
+      if (typeof model.metadata === 'object') self.metadata = new _TaskMetadata(model.metadata);
+      if (typeof model.with === 'object') self.with = new _HTTPArguments(model.with);
+    }
+    getLifecycleHooks('CallHTTP')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the CallHTTP.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new CallHTTP(this as any) as CallHTTPIntersection;
+    validate('CallHTTP', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the CallHTTP.
+   * Creates a copy of the CallHTTP, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the CallHTTP instance.
+   */
+  normalize(): CallHTTP & Specification.CallHTTP {
+    const copy = new CallHTTP(this as any) as CallHTTPIntersection;
+    return getLifecycleHooks('CallHTTP')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _CallHTTP = CallHTTP as CallHTTPConstructor;
diff --git a/src/lib/generated/classes/call-open-api.ts b/src/lib/generated/classes/call-open-api.ts
new file mode 100644
index 00000000..fd9cf090
--- /dev/null
+++ b/src/lib/generated/classes/call-open-api.ts
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Input } from './input';
+import { _Output } from './output';
+import { _Export } from './export';
+import { _TaskTimeout } from './task-timeout';
+import { _TaskMetadata } from './task-metadata';
+import { _OpenAPIArguments } from './open-api-arguments';
+import { _TaskBase } from './task-base';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the CallOpenAPI class and type
+ */
+export type CallOpenAPIIntersection = CallOpenAPI & Specification.CallOpenAPI;
+
+/**
+ * Represents a constructor for the intersection of the CallOpenAPI class and type
+ */
+export interface CallOpenAPIConstructor {
+  new (model?: Partial): CallOpenAPIIntersection;
+}
+
+/**
+ * Represents a CallOpenAPI with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class CallOpenAPI extends _TaskBase {
+  /**
+   * Instanciates a new instance of the CallOpenAPI class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the CallOpenAPI.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.CallOpenAPI & object;
+    if (isObject(model)) {
+      self.call = 'openapi' as const;
+      if (typeof model.input === 'object') self.input = new _Input(model.input);
+      if (typeof model.output === 'object') self.output = new _Output(model.output);
+      if (typeof model.export === 'object') self.export = new _Export(model.export);
+      if (typeof model.timeout === 'object') self.timeout = new _TaskTimeout(model.timeout);
+      if (typeof model.metadata === 'object') self.metadata = new _TaskMetadata(model.metadata);
+      if (typeof model.with === 'object') self.with = new _OpenAPIArguments(model.with);
+    }
+    getLifecycleHooks('CallOpenAPI')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the CallOpenAPI.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new CallOpenAPI(this as any) as CallOpenAPIIntersection;
+    validate('CallOpenAPI', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the CallOpenAPI.
+   * Creates a copy of the CallOpenAPI, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the CallOpenAPI instance.
+   */
+  normalize(): CallOpenAPI & Specification.CallOpenAPI {
+    const copy = new CallOpenAPI(this as any) as CallOpenAPIIntersection;
+    return getLifecycleHooks('CallOpenAPI')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _CallOpenAPI = CallOpenAPI as CallOpenAPIConstructor;
diff --git a/src/lib/generated/classes/call-task.ts b/src/lib/generated/classes/call-task.ts
new file mode 100644
index 00000000..1de2c772
--- /dev/null
+++ b/src/lib/generated/classes/call-task.ts
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Input } from './input';
+import { _Output } from './output';
+import { _Export } from './export';
+import { _TaskTimeout } from './task-timeout';
+import { _TaskMetadata } from './task-metadata';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the CallTask class and type
+ */
+export type CallTaskIntersection = CallTask & Specification.CallTask;
+
+/**
+ * Represents a constructor for the intersection of the CallTask class and type
+ */
+export interface CallTaskConstructor {
+  new (model?: Partial): CallTaskIntersection;
+}
+
+/**
+ * Represents a CallTask with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class CallTask extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the CallTask class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the CallTask.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.CallTask & object;
+    if (isObject(model)) {
+      if (typeof (model as Specification.TaskBase).input === 'object')
+        (self as Specification.TaskBase).input = new _Input(
+          (model as Specification.TaskBase).input as Specification.Input,
+        );
+      if (typeof (model as Specification.TaskBase).output === 'object')
+        (self as Specification.TaskBase).output = new _Output(
+          (model as Specification.TaskBase).output as Specification.Output,
+        );
+      if (typeof (model as Specification.TaskBase).export === 'object')
+        (self as Specification.TaskBase).export = new _Export(
+          (model as Specification.TaskBase).export as Specification.Export,
+        );
+      if (typeof (model as Specification.TaskBase).timeout === 'object')
+        (self as Specification.TaskBase).timeout = new _TaskTimeout(
+          (model as Specification.TaskBase).timeout as Specification.TaskTimeout,
+        );
+      if (typeof (model as Specification.TaskBase).metadata === 'object')
+        (self as Specification.TaskBase).metadata = new _TaskMetadata(
+          (model as Specification.TaskBase).metadata as Specification.TaskMetadata,
+        );
+    }
+    getLifecycleHooks('CallTask')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the CallTask.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new CallTask(this as any) as CallTaskIntersection;
+    validate('CallTask', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the CallTask.
+   * Creates a copy of the CallTask, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the CallTask instance.
+   */
+  normalize(): CallTask & Specification.CallTask {
+    const copy = new CallTask(this as any) as CallTaskIntersection;
+    return getLifecycleHooks('CallTask')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _CallTask = CallTask as CallTaskConstructor;
diff --git a/src/lib/generated/classes/catalog.ts b/src/lib/generated/classes/catalog.ts
new file mode 100644
index 00000000..e806b71b
--- /dev/null
+++ b/src/lib/generated/classes/catalog.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Endpoint } from './endpoint';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the Catalog class and type
+ */
+export type CatalogIntersection = Catalog & Specification.Catalog;
+
+/**
+ * Represents a constructor for the intersection of the Catalog class and type
+ */
+export interface CatalogConstructor {
+  new (model?: Partial): CatalogIntersection;
+}
+
+/**
+ * Represents a Catalog with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class Catalog extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the Catalog class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the Catalog.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.Catalog & object;
+    if (isObject(model)) {
+      if (typeof model.endpoint === 'object') self.endpoint = new _Endpoint(model.endpoint);
+    }
+    getLifecycleHooks('Catalog')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the Catalog.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new Catalog(this as any) as CatalogIntersection;
+    validate('Catalog', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the Catalog.
+   * Creates a copy of the Catalog, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the Catalog instance.
+   */
+  normalize(): Catalog & Specification.Catalog {
+    const copy = new Catalog(this as any) as CatalogIntersection;
+    return getLifecycleHooks('Catalog')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _Catalog = Catalog as CatalogConstructor;
diff --git a/src/lib/generated/classes/catch-errors.ts b/src/lib/generated/classes/catch-errors.ts
new file mode 100644
index 00000000..b36306c6
--- /dev/null
+++ b/src/lib/generated/classes/catch-errors.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _ErrorFilter } from './error-filter';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the CatchErrors class and type
+ */
+export type CatchErrorsIntersection = CatchErrors & Specification.CatchErrors;
+
+/**
+ * Represents a constructor for the intersection of the CatchErrors class and type
+ */
+export interface CatchErrorsConstructor {
+  new (model?: Partial): CatchErrorsIntersection;
+}
+
+/**
+ * Represents a CatchErrors with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class CatchErrors extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the CatchErrors class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the CatchErrors.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.CatchErrors & object;
+    if (isObject(model)) {
+      if (typeof model.with === 'object') self.with = new _ErrorFilter(model.with);
+    }
+    getLifecycleHooks('CatchErrors')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the CatchErrors.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new CatchErrors(this as any) as CatchErrorsIntersection;
+    validate('CatchErrors', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the CatchErrors.
+   * Creates a copy of the CatchErrors, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the CatchErrors instance.
+   */
+  normalize(): CatchErrors & Specification.CatchErrors {
+    const copy = new CatchErrors(this as any) as CatchErrorsIntersection;
+    return getLifecycleHooks('CatchErrors')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _CatchErrors = CatchErrors as CatchErrorsConstructor;
diff --git a/src/lib/generated/classes/constant-backoff.ts b/src/lib/generated/classes/constant-backoff.ts
new file mode 100644
index 00000000..0d0ce022
--- /dev/null
+++ b/src/lib/generated/classes/constant-backoff.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the ConstantBackoff class and type
+ */
+export type ConstantBackoffIntersection = ConstantBackoff & Specification.ConstantBackoff;
+
+/**
+ * Represents a constructor for the intersection of the ConstantBackoff class and type
+ */
+export interface ConstantBackoffConstructor {
+  new (model?: Partial): ConstantBackoffIntersection;
+}
+
+/**
+ * Represents a ConstantBackoff with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ConstantBackoff extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the ConstantBackoff class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ConstantBackoff.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('ConstantBackoff')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ConstantBackoff.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ConstantBackoff(this as any) as ConstantBackoffIntersection;
+    validate('ConstantBackoff', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ConstantBackoff.
+   * Creates a copy of the ConstantBackoff, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ConstantBackoff instance.
+   */
+  normalize(): ConstantBackoff & Specification.ConstantBackoff {
+    const copy = new ConstantBackoff(this as any) as ConstantBackoffIntersection;
+    return getLifecycleHooks('ConstantBackoff')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ConstantBackoff = ConstantBackoff as ConstantBackoffConstructor;
diff --git a/src/lib/generated/classes/container-environment.ts b/src/lib/generated/classes/container-environment.ts
new file mode 100644
index 00000000..664daa3e
--- /dev/null
+++ b/src/lib/generated/classes/container-environment.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the ContainerEnvironment class and type
+ */
+export type ContainerEnvironmentIntersection = ContainerEnvironment & Specification.ContainerEnvironment;
+
+/**
+ * Represents a constructor for the intersection of the ContainerEnvironment class and type
+ */
+export interface ContainerEnvironmentConstructor {
+  new (model?: Partial): ContainerEnvironmentIntersection;
+}
+
+/**
+ * Represents a ContainerEnvironment with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ContainerEnvironment extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the ContainerEnvironment class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ContainerEnvironment.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('ContainerEnvironment')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ContainerEnvironment.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ContainerEnvironment(this as any) as ContainerEnvironmentIntersection;
+    validate('ContainerEnvironment', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ContainerEnvironment.
+   * Creates a copy of the ContainerEnvironment, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ContainerEnvironment instance.
+   */
+  normalize(): ContainerEnvironment & Specification.ContainerEnvironment {
+    const copy = new ContainerEnvironment(this as any) as ContainerEnvironmentIntersection;
+    return getLifecycleHooks('ContainerEnvironment')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ContainerEnvironment = ContainerEnvironment as ContainerEnvironmentConstructor;
diff --git a/src/lib/generated/classes/container-lifetime.ts b/src/lib/generated/classes/container-lifetime.ts
new file mode 100644
index 00000000..c2ff200b
--- /dev/null
+++ b/src/lib/generated/classes/container-lifetime.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Duration } from './duration';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the ContainerLifetime class and type
+ */
+export type ContainerLifetimeIntersection = ContainerLifetime & Specification.ContainerLifetime;
+
+/**
+ * Represents a constructor for the intersection of the ContainerLifetime class and type
+ */
+export interface ContainerLifetimeConstructor {
+  new (model?: Partial): ContainerLifetimeIntersection;
+}
+
+/**
+ * Represents a ContainerLifetime with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ContainerLifetime extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the ContainerLifetime class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ContainerLifetime.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.ContainerLifetime & object;
+    if (isObject(model)) {
+      if (typeof model.after === 'object') self.after = new _Duration(model.after);
+    }
+    getLifecycleHooks('ContainerLifetime')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ContainerLifetime.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ContainerLifetime(this as any) as ContainerLifetimeIntersection;
+    validate('ContainerLifetime', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ContainerLifetime.
+   * Creates a copy of the ContainerLifetime, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ContainerLifetime instance.
+   */
+  normalize(): ContainerLifetime & Specification.ContainerLifetime {
+    const copy = new ContainerLifetime(this as any) as ContainerLifetimeIntersection;
+    return getLifecycleHooks('ContainerLifetime')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ContainerLifetime = ContainerLifetime as ContainerLifetimeConstructor;
diff --git a/src/lib/generated/classes/container-ports.ts b/src/lib/generated/classes/container-ports.ts
new file mode 100644
index 00000000..fd9615b1
--- /dev/null
+++ b/src/lib/generated/classes/container-ports.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the ContainerPorts class and type
+ */
+export type ContainerPortsIntersection = ContainerPorts & Specification.ContainerPorts;
+
+/**
+ * Represents a constructor for the intersection of the ContainerPorts class and type
+ */
+export interface ContainerPortsConstructor {
+  new (model?: Partial): ContainerPortsIntersection;
+}
+
+/**
+ * Represents a ContainerPorts with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ContainerPorts extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the ContainerPorts class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ContainerPorts.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('ContainerPorts')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ContainerPorts.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ContainerPorts(this as any) as ContainerPortsIntersection;
+    validate('ContainerPorts', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ContainerPorts.
+   * Creates a copy of the ContainerPorts, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ContainerPorts instance.
+   */
+  normalize(): ContainerPorts & Specification.ContainerPorts {
+    const copy = new ContainerPorts(this as any) as ContainerPortsIntersection;
+    return getLifecycleHooks('ContainerPorts')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ContainerPorts = ContainerPorts as ContainerPortsConstructor;
diff --git a/src/lib/generated/classes/container-volumes.ts b/src/lib/generated/classes/container-volumes.ts
new file mode 100644
index 00000000..14636b53
--- /dev/null
+++ b/src/lib/generated/classes/container-volumes.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the ContainerVolumes class and type
+ */
+export type ContainerVolumesIntersection = ContainerVolumes & Specification.ContainerVolumes;
+
+/**
+ * Represents a constructor for the intersection of the ContainerVolumes class and type
+ */
+export interface ContainerVolumesConstructor {
+  new (model?: Partial): ContainerVolumesIntersection;
+}
+
+/**
+ * Represents a ContainerVolumes with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ContainerVolumes extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the ContainerVolumes class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ContainerVolumes.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('ContainerVolumes')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ContainerVolumes.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ContainerVolumes(this as any) as ContainerVolumesIntersection;
+    validate('ContainerVolumes', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ContainerVolumes.
+   * Creates a copy of the ContainerVolumes, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ContainerVolumes instance.
+   */
+  normalize(): ContainerVolumes & Specification.ContainerVolumes {
+    const copy = new ContainerVolumes(this as any) as ContainerVolumesIntersection;
+    return getLifecycleHooks('ContainerVolumes')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ContainerVolumes = ContainerVolumes as ContainerVolumesConstructor;
diff --git a/src/lib/generated/classes/container.ts b/src/lib/generated/classes/container.ts
new file mode 100644
index 00000000..d65f23b9
--- /dev/null
+++ b/src/lib/generated/classes/container.ts
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _ContainerPorts } from './container-ports';
+import { _ContainerVolumes } from './container-volumes';
+import { _ContainerEnvironment } from './container-environment';
+import { _ContainerLifetime } from './container-lifetime';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the Container class and type
+ */
+export type ContainerIntersection = Container & Specification.Container;
+
+/**
+ * Represents a constructor for the intersection of the Container class and type
+ */
+export interface ContainerConstructor {
+  new (model?: Partial): ContainerIntersection;
+}
+
+/**
+ * Represents a Container with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class Container extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the Container class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the Container.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.Container & object;
+    if (isObject(model)) {
+      if (typeof model.ports === 'object') self.ports = new _ContainerPorts(model.ports);
+      if (typeof model.volumes === 'object') self.volumes = new _ContainerVolumes(model.volumes);
+      if (typeof model.environment === 'object') self.environment = new _ContainerEnvironment(model.environment);
+      if (typeof model.lifetime === 'object') self.lifetime = new _ContainerLifetime(model.lifetime);
+    }
+    getLifecycleHooks('Container')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the Container.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new Container(this as any) as ContainerIntersection;
+    validate('Container', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the Container.
+   * Creates a copy of the Container, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the Container instance.
+   */
+  normalize(): Container & Specification.Container {
+    const copy = new Container(this as any) as ContainerIntersection;
+    return getLifecycleHooks('Container')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _Container = Container as ContainerConstructor;
diff --git a/src/lib/generated/classes/digest-authentication-policy-configuration.ts b/src/lib/generated/classes/digest-authentication-policy-configuration.ts
new file mode 100644
index 00000000..5b3de79e
--- /dev/null
+++ b/src/lib/generated/classes/digest-authentication-policy-configuration.ts
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the DigestAuthenticationPolicyConfiguration class and type
+ */
+export type DigestAuthenticationPolicyConfigurationIntersection = DigestAuthenticationPolicyConfiguration &
+  Specification.DigestAuthenticationPolicyConfiguration;
+
+/**
+ * Represents a constructor for the intersection of the DigestAuthenticationPolicyConfiguration class and type
+ */
+export interface DigestAuthenticationPolicyConfigurationConstructor {
+  new (
+    model?: Partial,
+  ): DigestAuthenticationPolicyConfigurationIntersection;
+}
+
+/**
+ * Represents a DigestAuthenticationPolicyConfiguration with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class DigestAuthenticationPolicyConfiguration extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the DigestAuthenticationPolicyConfiguration class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the DigestAuthenticationPolicyConfiguration.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('DigestAuthenticationPolicyConfiguration')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the DigestAuthenticationPolicyConfiguration.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new DigestAuthenticationPolicyConfiguration(
+      this as any,
+    ) as DigestAuthenticationPolicyConfigurationIntersection;
+    validate('DigestAuthenticationPolicyConfiguration', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the DigestAuthenticationPolicyConfiguration.
+   * Creates a copy of the DigestAuthenticationPolicyConfiguration, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the DigestAuthenticationPolicyConfiguration instance.
+   */
+  normalize(): DigestAuthenticationPolicyConfiguration & Specification.DigestAuthenticationPolicyConfiguration {
+    const copy = new DigestAuthenticationPolicyConfiguration(
+      this as any,
+    ) as DigestAuthenticationPolicyConfigurationIntersection;
+    return getLifecycleHooks('DigestAuthenticationPolicyConfiguration')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _DigestAuthenticationPolicyConfiguration =
+  DigestAuthenticationPolicyConfiguration as DigestAuthenticationPolicyConfigurationConstructor;
diff --git a/src/lib/generated/classes/digest-authentication-policy.ts b/src/lib/generated/classes/digest-authentication-policy.ts
new file mode 100644
index 00000000..60ca2ad1
--- /dev/null
+++ b/src/lib/generated/classes/digest-authentication-policy.ts
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _DigestAuthenticationPolicyConfiguration } from './digest-authentication-policy-configuration';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the DigestAuthenticationPolicy class and type
+ */
+export type DigestAuthenticationPolicyIntersection = DigestAuthenticationPolicy &
+  Specification.DigestAuthenticationPolicy;
+
+/**
+ * Represents a constructor for the intersection of the DigestAuthenticationPolicy class and type
+ */
+export interface DigestAuthenticationPolicyConstructor {
+  new (model?: Partial): DigestAuthenticationPolicyIntersection;
+}
+
+/**
+ * Represents a DigestAuthenticationPolicy with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class DigestAuthenticationPolicy extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the DigestAuthenticationPolicy class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the DigestAuthenticationPolicy.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.DigestAuthenticationPolicy & object;
+    if (isObject(model)) {
+      if (typeof model.digest === 'object') self.digest = new _DigestAuthenticationPolicyConfiguration(model.digest);
+    }
+    getLifecycleHooks('DigestAuthenticationPolicy')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the DigestAuthenticationPolicy.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new DigestAuthenticationPolicy(this as any) as DigestAuthenticationPolicyIntersection;
+    validate('DigestAuthenticationPolicy', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the DigestAuthenticationPolicy.
+   * Creates a copy of the DigestAuthenticationPolicy, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the DigestAuthenticationPolicy instance.
+   */
+  normalize(): DigestAuthenticationPolicy & Specification.DigestAuthenticationPolicy {
+    const copy = new DigestAuthenticationPolicy(this as any) as DigestAuthenticationPolicyIntersection;
+    return getLifecycleHooks('DigestAuthenticationPolicy')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _DigestAuthenticationPolicy = DigestAuthenticationPolicy as DigestAuthenticationPolicyConstructor;
diff --git a/src/lib/generated/classes/digest-authentication-properties.ts b/src/lib/generated/classes/digest-authentication-properties.ts
new file mode 100644
index 00000000..c0529b42
--- /dev/null
+++ b/src/lib/generated/classes/digest-authentication-properties.ts
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the DigestAuthenticationProperties class and type
+ */
+export type DigestAuthenticationPropertiesIntersection = DigestAuthenticationProperties &
+  Specification.DigestAuthenticationProperties;
+
+/**
+ * Represents a constructor for the intersection of the DigestAuthenticationProperties class and type
+ */
+export interface DigestAuthenticationPropertiesConstructor {
+  new (model?: Partial): DigestAuthenticationPropertiesIntersection;
+}
+
+/**
+ * Represents a DigestAuthenticationProperties with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class DigestAuthenticationProperties extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the DigestAuthenticationProperties class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the DigestAuthenticationProperties.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('DigestAuthenticationProperties')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the DigestAuthenticationProperties.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new DigestAuthenticationProperties(this as any) as DigestAuthenticationPropertiesIntersection;
+    validate('DigestAuthenticationProperties', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the DigestAuthenticationProperties.
+   * Creates a copy of the DigestAuthenticationProperties, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the DigestAuthenticationProperties instance.
+   */
+  normalize(): DigestAuthenticationProperties & Specification.DigestAuthenticationProperties {
+    const copy = new DigestAuthenticationProperties(this as any) as DigestAuthenticationPropertiesIntersection;
+    return getLifecycleHooks('DigestAuthenticationProperties')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _DigestAuthenticationProperties =
+  DigestAuthenticationProperties as DigestAuthenticationPropertiesConstructor;
diff --git a/src/lib/generated/classes/do-task.ts b/src/lib/generated/classes/do-task.ts
new file mode 100644
index 00000000..0b843c6c
--- /dev/null
+++ b/src/lib/generated/classes/do-task.ts
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Input } from './input';
+import { _Output } from './output';
+import { _Export } from './export';
+import { _TaskTimeout } from './task-timeout';
+import { _TaskMetadata } from './task-metadata';
+import { _TaskList } from './task-list';
+import { _TaskBase } from './task-base';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the DoTask class and type
+ */
+export type DoTaskIntersection = DoTask & Specification.DoTask;
+
+/**
+ * Represents a constructor for the intersection of the DoTask class and type
+ */
+export interface DoTaskConstructor {
+  new (model?: Partial): DoTaskIntersection;
+}
+
+/**
+ * Represents a DoTask with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class DoTask extends _TaskBase {
+  /**
+   * Instanciates a new instance of the DoTask class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the DoTask.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.DoTask & object;
+    if (isObject(model)) {
+      if (typeof model.input === 'object') self.input = new _Input(model.input);
+      if (typeof model.output === 'object') self.output = new _Output(model.output);
+      if (typeof model.export === 'object') self.export = new _Export(model.export);
+      if (typeof model.timeout === 'object') self.timeout = new _TaskTimeout(model.timeout);
+      if (typeof model.metadata === 'object') self.metadata = new _TaskMetadata(model.metadata);
+      if (typeof model.do === 'object') self.do = new _TaskList(model.do);
+    }
+    getLifecycleHooks('DoTask')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the DoTask.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new DoTask(this as any) as DoTaskIntersection;
+    validate('DoTask', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the DoTask.
+   * Creates a copy of the DoTask, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the DoTask instance.
+   */
+  normalize(): DoTask & Specification.DoTask {
+    const copy = new DoTask(this as any) as DoTaskIntersection;
+    return getLifecycleHooks('DoTask')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _DoTask = DoTask as DoTaskConstructor;
diff --git a/src/lib/generated/classes/document.ts b/src/lib/generated/classes/document.ts
new file mode 100644
index 00000000..f7f773c2
--- /dev/null
+++ b/src/lib/generated/classes/document.ts
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _WorkflowTags } from './workflow-tags';
+import { _WorkflowMetadata } from './workflow-metadata';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the Document class and type
+ */
+export type DocumentIntersection = Document & Specification.Document;
+
+/**
+ * Represents a constructor for the intersection of the Document class and type
+ */
+export interface DocumentConstructor {
+  new (model?: Partial): DocumentIntersection;
+}
+
+/**
+ * Represents a Document with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class Document extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the Document class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the Document.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.Document & object;
+    if (isObject(model)) {
+      if (typeof model.tags === 'object') self.tags = new _WorkflowTags(model.tags);
+      if (typeof model.metadata === 'object') self.metadata = new _WorkflowMetadata(model.metadata);
+    }
+    getLifecycleHooks('Document')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the Document.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new Document(this as any) as DocumentIntersection;
+    validate('Document', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the Document.
+   * Creates a copy of the Document, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the Document instance.
+   */
+  normalize(): Document & Specification.Document {
+    const copy = new Document(this as any) as DocumentIntersection;
+    return getLifecycleHooks('Document')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _Document = Document as DocumentConstructor;
diff --git a/src/lib/generated/classes/duration-inline.ts b/src/lib/generated/classes/duration-inline.ts
new file mode 100644
index 00000000..14d16e61
--- /dev/null
+++ b/src/lib/generated/classes/duration-inline.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the DurationInline class and type
+ */
+export type DurationInlineIntersection = DurationInline & Specification.DurationInline;
+
+/**
+ * Represents a constructor for the intersection of the DurationInline class and type
+ */
+export interface DurationInlineConstructor {
+  new (model?: Partial): DurationInlineIntersection;
+}
+
+/**
+ * Represents a DurationInline with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class DurationInline extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the DurationInline class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the DurationInline.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('DurationInline')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the DurationInline.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new DurationInline(this as any) as DurationInlineIntersection;
+    validate('DurationInline', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the DurationInline.
+   * Creates a copy of the DurationInline, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the DurationInline instance.
+   */
+  normalize(): DurationInline & Specification.DurationInline {
+    const copy = new DurationInline(this as any) as DurationInlineIntersection;
+    return getLifecycleHooks('DurationInline')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _DurationInline = DurationInline as DurationInlineConstructor;
diff --git a/src/lib/generated/classes/duration.ts b/src/lib/generated/classes/duration.ts
new file mode 100644
index 00000000..0df55911
--- /dev/null
+++ b/src/lib/generated/classes/duration.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the Duration class and type
+ */
+export type DurationIntersection = Duration & Specification.Duration;
+
+/**
+ * Represents a constructor for the intersection of the Duration class and type
+ */
+export interface DurationConstructor {
+  new (model?: Partial): DurationIntersection;
+}
+
+/**
+ * Represents a Duration with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class Duration extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the Duration class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the Duration.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('Duration')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the Duration.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new Duration(this as any) as DurationIntersection;
+    validate('Duration', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the Duration.
+   * Creates a copy of the Duration, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the Duration instance.
+   */
+  normalize(): Duration & Specification.Duration {
+    const copy = new Duration(this as any) as DurationIntersection;
+    return getLifecycleHooks('Duration')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _Duration = Duration as DurationConstructor;
diff --git a/src/lib/generated/classes/emit-event-definition.ts b/src/lib/generated/classes/emit-event-definition.ts
new file mode 100644
index 00000000..d388f3de
--- /dev/null
+++ b/src/lib/generated/classes/emit-event-definition.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _EmitEventWith } from './emit-event-with';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the EmitEventDefinition class and type
+ */
+export type EmitEventDefinitionIntersection = EmitEventDefinition & Specification.EmitEventDefinition;
+
+/**
+ * Represents a constructor for the intersection of the EmitEventDefinition class and type
+ */
+export interface EmitEventDefinitionConstructor {
+  new (model?: Partial): EmitEventDefinitionIntersection;
+}
+
+/**
+ * Represents a EmitEventDefinition with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class EmitEventDefinition extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the EmitEventDefinition class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the EmitEventDefinition.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.EmitEventDefinition & object;
+    if (isObject(model)) {
+      if (typeof model.with === 'object') self.with = new _EmitEventWith(model.with);
+    }
+    getLifecycleHooks('EmitEventDefinition')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the EmitEventDefinition.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new EmitEventDefinition(this as any) as EmitEventDefinitionIntersection;
+    validate('EmitEventDefinition', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the EmitEventDefinition.
+   * Creates a copy of the EmitEventDefinition, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the EmitEventDefinition instance.
+   */
+  normalize(): EmitEventDefinition & Specification.EmitEventDefinition {
+    const copy = new EmitEventDefinition(this as any) as EmitEventDefinitionIntersection;
+    return getLifecycleHooks('EmitEventDefinition')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _EmitEventDefinition = EmitEventDefinition as EmitEventDefinitionConstructor;
diff --git a/src/lib/generated/classes/emit-event-with.ts b/src/lib/generated/classes/emit-event-with.ts
new file mode 100644
index 00000000..45ccbf66
--- /dev/null
+++ b/src/lib/generated/classes/emit-event-with.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the EmitEventWith class and type
+ */
+export type EmitEventWithIntersection = EmitEventWith & Specification.EmitEventWith;
+
+/**
+ * Represents a constructor for the intersection of the EmitEventWith class and type
+ */
+export interface EmitEventWithConstructor {
+  new (model?: Partial): EmitEventWithIntersection;
+}
+
+/**
+ * Represents a EmitEventWith with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class EmitEventWith extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the EmitEventWith class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the EmitEventWith.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('EmitEventWith')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the EmitEventWith.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new EmitEventWith(this as any) as EmitEventWithIntersection;
+    validate('EmitEventWith', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the EmitEventWith.
+   * Creates a copy of the EmitEventWith, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the EmitEventWith instance.
+   */
+  normalize(): EmitEventWith & Specification.EmitEventWith {
+    const copy = new EmitEventWith(this as any) as EmitEventWithIntersection;
+    return getLifecycleHooks('EmitEventWith')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _EmitEventWith = EmitEventWith as EmitEventWithConstructor;
diff --git a/src/lib/generated/classes/emit-task-configuration.ts b/src/lib/generated/classes/emit-task-configuration.ts
new file mode 100644
index 00000000..c0815885
--- /dev/null
+++ b/src/lib/generated/classes/emit-task-configuration.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _EmitEventDefinition } from './emit-event-definition';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the EmitTaskConfiguration class and type
+ */
+export type EmitTaskConfigurationIntersection = EmitTaskConfiguration & Specification.EmitTaskConfiguration;
+
+/**
+ * Represents a constructor for the intersection of the EmitTaskConfiguration class and type
+ */
+export interface EmitTaskConfigurationConstructor {
+  new (model?: Partial): EmitTaskConfigurationIntersection;
+}
+
+/**
+ * Represents a EmitTaskConfiguration with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class EmitTaskConfiguration extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the EmitTaskConfiguration class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the EmitTaskConfiguration.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.EmitTaskConfiguration & object;
+    if (isObject(model)) {
+      if (typeof model.event === 'object') self.event = new _EmitEventDefinition(model.event);
+    }
+    getLifecycleHooks('EmitTaskConfiguration')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the EmitTaskConfiguration.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new EmitTaskConfiguration(this as any) as EmitTaskConfigurationIntersection;
+    validate('EmitTaskConfiguration', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the EmitTaskConfiguration.
+   * Creates a copy of the EmitTaskConfiguration, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the EmitTaskConfiguration instance.
+   */
+  normalize(): EmitTaskConfiguration & Specification.EmitTaskConfiguration {
+    const copy = new EmitTaskConfiguration(this as any) as EmitTaskConfigurationIntersection;
+    return getLifecycleHooks('EmitTaskConfiguration')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _EmitTaskConfiguration = EmitTaskConfiguration as EmitTaskConfigurationConstructor;
diff --git a/src/lib/generated/classes/emit-task.ts b/src/lib/generated/classes/emit-task.ts
new file mode 100644
index 00000000..b3609aa2
--- /dev/null
+++ b/src/lib/generated/classes/emit-task.ts
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Input } from './input';
+import { _Output } from './output';
+import { _Export } from './export';
+import { _TaskTimeout } from './task-timeout';
+import { _TaskMetadata } from './task-metadata';
+import { _EmitTaskConfiguration } from './emit-task-configuration';
+import { _TaskBase } from './task-base';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the EmitTask class and type
+ */
+export type EmitTaskIntersection = EmitTask & Specification.EmitTask;
+
+/**
+ * Represents a constructor for the intersection of the EmitTask class and type
+ */
+export interface EmitTaskConstructor {
+  new (model?: Partial): EmitTaskIntersection;
+}
+
+/**
+ * Represents a EmitTask with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class EmitTask extends _TaskBase {
+  /**
+   * Instanciates a new instance of the EmitTask class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the EmitTask.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.EmitTask & object;
+    if (isObject(model)) {
+      if (typeof model.input === 'object') self.input = new _Input(model.input);
+      if (typeof model.output === 'object') self.output = new _Output(model.output);
+      if (typeof model.export === 'object') self.export = new _Export(model.export);
+      if (typeof model.timeout === 'object') self.timeout = new _TaskTimeout(model.timeout);
+      if (typeof model.metadata === 'object') self.metadata = new _TaskMetadata(model.metadata);
+      if (typeof model.emit === 'object') self.emit = new _EmitTaskConfiguration(model.emit);
+    }
+    getLifecycleHooks('EmitTask')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the EmitTask.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new EmitTask(this as any) as EmitTaskIntersection;
+    validate('EmitTask', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the EmitTask.
+   * Creates a copy of the EmitTask, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the EmitTask instance.
+   */
+  normalize(): EmitTask & Specification.EmitTask {
+    const copy = new EmitTask(this as any) as EmitTaskIntersection;
+    return getLifecycleHooks('EmitTask')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _EmitTask = EmitTask as EmitTaskConstructor;
diff --git a/src/lib/generated/classes/endpoint-configuration.ts b/src/lib/generated/classes/endpoint-configuration.ts
new file mode 100644
index 00000000..401f12c6
--- /dev/null
+++ b/src/lib/generated/classes/endpoint-configuration.ts
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _ReferenceableAuthenticationPolicy } from './referenceable-authentication-policy';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the EndpointConfiguration class and type
+ */
+export type EndpointConfigurationIntersection = EndpointConfiguration & Specification.EndpointConfiguration;
+
+/**
+ * Represents a constructor for the intersection of the EndpointConfiguration class and type
+ */
+export interface EndpointConfigurationConstructor {
+  new (model?: Partial): EndpointConfigurationIntersection;
+}
+
+/**
+ * Represents a EndpointConfiguration with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class EndpointConfiguration extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the EndpointConfiguration class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the EndpointConfiguration.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.EndpointConfiguration & object;
+    if (isObject(model)) {
+      if (typeof model.authentication === 'object')
+        self.authentication = new _ReferenceableAuthenticationPolicy(model.authentication);
+    }
+    getLifecycleHooks('EndpointConfiguration')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the EndpointConfiguration.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new EndpointConfiguration(this as any) as EndpointConfigurationIntersection;
+    validate('EndpointConfiguration', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the EndpointConfiguration.
+   * Creates a copy of the EndpointConfiguration, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the EndpointConfiguration instance.
+   */
+  normalize(): EndpointConfiguration & Specification.EndpointConfiguration {
+    const copy = new EndpointConfiguration(this as any) as EndpointConfigurationIntersection;
+    return getLifecycleHooks('EndpointConfiguration')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _EndpointConfiguration = EndpointConfiguration as EndpointConfigurationConstructor;
diff --git a/src/lib/generated/classes/endpoint-uri.ts b/src/lib/generated/classes/endpoint-uri.ts
new file mode 100644
index 00000000..ab7a36f0
--- /dev/null
+++ b/src/lib/generated/classes/endpoint-uri.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the EndpointUri class and type
+ */
+export type EndpointUriIntersection = EndpointUri & Specification.EndpointUri;
+
+/**
+ * Represents a constructor for the intersection of the EndpointUri class and type
+ */
+export interface EndpointUriConstructor {
+  new (model?: Partial): EndpointUriIntersection;
+}
+
+/**
+ * Represents a EndpointUri with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class EndpointUri extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the EndpointUri class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the EndpointUri.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('EndpointUri')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the EndpointUri.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new EndpointUri(this as any) as EndpointUriIntersection;
+    validate('EndpointUri', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the EndpointUri.
+   * Creates a copy of the EndpointUri, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the EndpointUri instance.
+   */
+  normalize(): EndpointUri & Specification.EndpointUri {
+    const copy = new EndpointUri(this as any) as EndpointUriIntersection;
+    return getLifecycleHooks('EndpointUri')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _EndpointUri = EndpointUri as EndpointUriConstructor;
diff --git a/src/lib/generated/classes/endpoint.ts b/src/lib/generated/classes/endpoint.ts
new file mode 100644
index 00000000..84af5d58
--- /dev/null
+++ b/src/lib/generated/classes/endpoint.ts
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _ReferenceableAuthenticationPolicy } from './referenceable-authentication-policy';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the Endpoint class and type
+ */
+export type EndpointIntersection = Endpoint & Specification.Endpoint;
+
+/**
+ * Represents a constructor for the intersection of the Endpoint class and type
+ */
+export interface EndpointConstructor {
+  new (model?: Partial): EndpointIntersection;
+}
+
+/**
+ * Represents a Endpoint with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class Endpoint extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the Endpoint class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the Endpoint.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.Endpoint & object;
+    if (isObject(model)) {
+      if (typeof (model as Specification.EndpointConfiguration).authentication === 'object')
+        (self as Specification.EndpointConfiguration).authentication = new _ReferenceableAuthenticationPolicy(
+          (model as Specification.EndpointConfiguration)
+            .authentication as Specification.ReferenceableAuthenticationPolicy,
+        );
+    }
+    getLifecycleHooks('Endpoint')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the Endpoint.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new Endpoint(this as any) as EndpointIntersection;
+    validate('Endpoint', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the Endpoint.
+   * Creates a copy of the Endpoint, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the Endpoint instance.
+   */
+  normalize(): Endpoint & Specification.Endpoint {
+    const copy = new Endpoint(this as any) as EndpointIntersection;
+    return getLifecycleHooks('Endpoint')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _Endpoint = Endpoint as EndpointConstructor;
diff --git a/src/lib/generated/classes/error-filter.ts b/src/lib/generated/classes/error-filter.ts
new file mode 100644
index 00000000..76a9e369
--- /dev/null
+++ b/src/lib/generated/classes/error-filter.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the ErrorFilter class and type
+ */
+export type ErrorFilterIntersection = ErrorFilter & Specification.ErrorFilter;
+
+/**
+ * Represents a constructor for the intersection of the ErrorFilter class and type
+ */
+export interface ErrorFilterConstructor {
+  new (model?: Partial): ErrorFilterIntersection;
+}
+
+/**
+ * Represents a ErrorFilter with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ErrorFilter extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the ErrorFilter class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ErrorFilter.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('ErrorFilter')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ErrorFilter.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ErrorFilter(this as any) as ErrorFilterIntersection;
+    validate('ErrorFilter', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ErrorFilter.
+   * Creates a copy of the ErrorFilter, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ErrorFilter instance.
+   */
+  normalize(): ErrorFilter & Specification.ErrorFilter {
+    const copy = new ErrorFilter(this as any) as ErrorFilterIntersection;
+    return getLifecycleHooks('ErrorFilter')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ErrorFilter = ErrorFilter as ErrorFilterConstructor;
diff --git a/src/lib/generated/classes/error-instance.ts b/src/lib/generated/classes/error-instance.ts
new file mode 100644
index 00000000..0a704322
--- /dev/null
+++ b/src/lib/generated/classes/error-instance.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the ErrorInstance class and type
+ */
+export type ErrorInstanceIntersection = ErrorInstance & Specification.ErrorInstance;
+
+/**
+ * Represents a constructor for the intersection of the ErrorInstance class and type
+ */
+export interface ErrorInstanceConstructor {
+  new (model?: Partial): ErrorInstanceIntersection;
+}
+
+/**
+ * Represents a ErrorInstance with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ErrorInstance extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the ErrorInstance class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ErrorInstance.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('ErrorInstance')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ErrorInstance.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ErrorInstance(this as any) as ErrorInstanceIntersection;
+    validate('ErrorInstance', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ErrorInstance.
+   * Creates a copy of the ErrorInstance, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ErrorInstance instance.
+   */
+  normalize(): ErrorInstance & Specification.ErrorInstance {
+    const copy = new ErrorInstance(this as any) as ErrorInstanceIntersection;
+    return getLifecycleHooks('ErrorInstance')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ErrorInstance = ErrorInstance as ErrorInstanceConstructor;
diff --git a/src/lib/generated/classes/error-type.ts b/src/lib/generated/classes/error-type.ts
new file mode 100644
index 00000000..ba3e72d7
--- /dev/null
+++ b/src/lib/generated/classes/error-type.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the ErrorType class and type
+ */
+export type ErrorTypeIntersection = ErrorType & Specification.ErrorType;
+
+/**
+ * Represents a constructor for the intersection of the ErrorType class and type
+ */
+export interface ErrorTypeConstructor {
+  new (model?: Partial): ErrorTypeIntersection;
+}
+
+/**
+ * Represents a ErrorType with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ErrorType extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the ErrorType class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ErrorType.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('ErrorType')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ErrorType.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ErrorType(this as any) as ErrorTypeIntersection;
+    validate('ErrorType', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ErrorType.
+   * Creates a copy of the ErrorType, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ErrorType instance.
+   */
+  normalize(): ErrorType & Specification.ErrorType {
+    const copy = new ErrorType(this as any) as ErrorTypeIntersection;
+    return getLifecycleHooks('ErrorType')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ErrorType = ErrorType as ErrorTypeConstructor;
diff --git a/src/lib/generated/classes/error.ts b/src/lib/generated/classes/error.ts
new file mode 100644
index 00000000..19e1fbb4
--- /dev/null
+++ b/src/lib/generated/classes/error.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the Error class and type
+ */
+export type ErrorIntersection = Error & Specification.Error;
+
+/**
+ * Represents a constructor for the intersection of the Error class and type
+ */
+export interface ErrorConstructor {
+  new (model?: Partial): ErrorIntersection;
+}
+
+/**
+ * Represents a Error with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class Error extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the Error class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the Error.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('Error')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the Error.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new Error(this as any) as ErrorIntersection;
+    validate('Error', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the Error.
+   * Creates a copy of the Error, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the Error instance.
+   */
+  normalize(): Error & Specification.Error {
+    const copy = new Error(this as any) as ErrorIntersection;
+    return getLifecycleHooks('Error')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _Error = Error as ErrorConstructor;
diff --git a/src/lib/generated/classes/event-consumption-strategy.ts b/src/lib/generated/classes/event-consumption-strategy.ts
new file mode 100644
index 00000000..769c9ff1
--- /dev/null
+++ b/src/lib/generated/classes/event-consumption-strategy.ts
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _AllEventConsumptionStrategyConfiguration } from './all-event-consumption-strategy-configuration';
+import { _AnyEventConsumptionStrategyConfiguration } from './any-event-consumption-strategy-configuration';
+import { _AnyEventConsumptionStrategyUntil } from './any-event-consumption-strategy-until';
+import { _EventFilter } from './event-filter';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the EventConsumptionStrategy class and type
+ */
+export type EventConsumptionStrategyIntersection = EventConsumptionStrategy & Specification.EventConsumptionStrategy;
+
+/**
+ * Represents a constructor for the intersection of the EventConsumptionStrategy class and type
+ */
+export interface EventConsumptionStrategyConstructor {
+  new (model?: Partial): EventConsumptionStrategyIntersection;
+}
+
+/**
+ * Represents a EventConsumptionStrategy with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class EventConsumptionStrategy extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the EventConsumptionStrategy class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the EventConsumptionStrategy.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.EventConsumptionStrategy & object;
+    if (isObject(model)) {
+      if (typeof (model as Specification.AllEventConsumptionStrategy).all === 'object')
+        (self as Specification.AllEventConsumptionStrategy).all = new _AllEventConsumptionStrategyConfiguration(
+          (model as Specification.AllEventConsumptionStrategy)
+            .all as Specification.AllEventConsumptionStrategyConfiguration,
+        );
+      if (typeof (model as Specification.AnyEventConsumptionStrategy).any === 'object')
+        (self as Specification.AnyEventConsumptionStrategy).any = new _AnyEventConsumptionStrategyConfiguration(
+          (model as Specification.AnyEventConsumptionStrategy)
+            .any as Specification.AnyEventConsumptionStrategyConfiguration,
+        );
+      if (typeof (model as Specification.AnyEventConsumptionStrategy).until === 'object')
+        (self as Specification.AnyEventConsumptionStrategy).until = new _AnyEventConsumptionStrategyUntil(
+          (model as Specification.AnyEventConsumptionStrategy).until as Specification.AnyEventConsumptionStrategyUntil,
+        );
+      if (typeof (model as Specification.OneEventConsumptionStrategy).one === 'object')
+        (self as Specification.OneEventConsumptionStrategy).one = new _EventFilter(
+          (model as Specification.OneEventConsumptionStrategy).one as Specification.EventFilter,
+        );
+    }
+    getLifecycleHooks('EventConsumptionStrategy')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the EventConsumptionStrategy.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new EventConsumptionStrategy(this as any) as EventConsumptionStrategyIntersection;
+    validate('EventConsumptionStrategy', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the EventConsumptionStrategy.
+   * Creates a copy of the EventConsumptionStrategy, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the EventConsumptionStrategy instance.
+   */
+  normalize(): EventConsumptionStrategy & Specification.EventConsumptionStrategy {
+    const copy = new EventConsumptionStrategy(this as any) as EventConsumptionStrategyIntersection;
+    return getLifecycleHooks('EventConsumptionStrategy')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _EventConsumptionStrategy = EventConsumptionStrategy as EventConsumptionStrategyConstructor;
diff --git a/src/lib/generated/classes/event-data.ts b/src/lib/generated/classes/event-data.ts
new file mode 100644
index 00000000..d802410c
--- /dev/null
+++ b/src/lib/generated/classes/event-data.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the EventData class and type
+ */
+export type EventDataIntersection = EventData & Specification.EventData;
+
+/**
+ * Represents a constructor for the intersection of the EventData class and type
+ */
+export interface EventDataConstructor {
+  new (model?: Partial): EventDataIntersection;
+}
+
+/**
+ * Represents a EventData with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class EventData extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the EventData class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the EventData.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('EventData')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the EventData.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new EventData(this as any) as EventDataIntersection;
+    validate('EventData', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the EventData.
+   * Creates a copy of the EventData, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the EventData instance.
+   */
+  normalize(): EventData & Specification.EventData {
+    const copy = new EventData(this as any) as EventDataIntersection;
+    return getLifecycleHooks('EventData')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _EventData = EventData as EventDataConstructor;
diff --git a/src/lib/generated/classes/event-dataschema.ts b/src/lib/generated/classes/event-dataschema.ts
new file mode 100644
index 00000000..20d0f62e
--- /dev/null
+++ b/src/lib/generated/classes/event-dataschema.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the EventDataschema class and type
+ */
+export type EventDataschemaIntersection = EventDataschema & Specification.EventDataschema;
+
+/**
+ * Represents a constructor for the intersection of the EventDataschema class and type
+ */
+export interface EventDataschemaConstructor {
+  new (model?: Partial): EventDataschemaIntersection;
+}
+
+/**
+ * Represents a EventDataschema with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class EventDataschema extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the EventDataschema class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the EventDataschema.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('EventDataschema')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the EventDataschema.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new EventDataschema(this as any) as EventDataschemaIntersection;
+    validate('EventDataschema', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the EventDataschema.
+   * Creates a copy of the EventDataschema, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the EventDataschema instance.
+   */
+  normalize(): EventDataschema & Specification.EventDataschema {
+    const copy = new EventDataschema(this as any) as EventDataschemaIntersection;
+    return getLifecycleHooks('EventDataschema')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _EventDataschema = EventDataschema as EventDataschemaConstructor;
diff --git a/src/lib/generated/classes/event-filter-correlate.ts b/src/lib/generated/classes/event-filter-correlate.ts
new file mode 100644
index 00000000..b03b20ed
--- /dev/null
+++ b/src/lib/generated/classes/event-filter-correlate.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the EventFilterCorrelate class and type
+ */
+export type EventFilterCorrelateIntersection = EventFilterCorrelate & Specification.EventFilterCorrelate;
+
+/**
+ * Represents a constructor for the intersection of the EventFilterCorrelate class and type
+ */
+export interface EventFilterCorrelateConstructor {
+  new (model?: Partial): EventFilterCorrelateIntersection;
+}
+
+/**
+ * Represents a EventFilterCorrelate with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class EventFilterCorrelate extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the EventFilterCorrelate class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the EventFilterCorrelate.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('EventFilterCorrelate')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the EventFilterCorrelate.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new EventFilterCorrelate(this as any) as EventFilterCorrelateIntersection;
+    validate('EventFilterCorrelate', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the EventFilterCorrelate.
+   * Creates a copy of the EventFilterCorrelate, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the EventFilterCorrelate instance.
+   */
+  normalize(): EventFilterCorrelate & Specification.EventFilterCorrelate {
+    const copy = new EventFilterCorrelate(this as any) as EventFilterCorrelateIntersection;
+    return getLifecycleHooks('EventFilterCorrelate')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _EventFilterCorrelate = EventFilterCorrelate as EventFilterCorrelateConstructor;
diff --git a/src/lib/generated/classes/event-filter.ts b/src/lib/generated/classes/event-filter.ts
new file mode 100644
index 00000000..1427b768
--- /dev/null
+++ b/src/lib/generated/classes/event-filter.ts
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _WithEvent } from './with-event';
+import { _EventFilterCorrelate } from './event-filter-correlate';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the EventFilter class and type
+ */
+export type EventFilterIntersection = EventFilter & Specification.EventFilter;
+
+/**
+ * Represents a constructor for the intersection of the EventFilter class and type
+ */
+export interface EventFilterConstructor {
+  new (model?: Partial): EventFilterIntersection;
+}
+
+/**
+ * Represents a EventFilter with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class EventFilter extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the EventFilter class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the EventFilter.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.EventFilter & object;
+    if (isObject(model)) {
+      if (typeof model.with === 'object') self.with = new _WithEvent(model.with);
+      if (typeof model.correlate === 'object') self.correlate = new _EventFilterCorrelate(model.correlate);
+    }
+    getLifecycleHooks('EventFilter')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the EventFilter.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new EventFilter(this as any) as EventFilterIntersection;
+    validate('EventFilter', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the EventFilter.
+   * Creates a copy of the EventFilter, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the EventFilter instance.
+   */
+  normalize(): EventFilter & Specification.EventFilter {
+    const copy = new EventFilter(this as any) as EventFilterIntersection;
+    return getLifecycleHooks('EventFilter')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _EventFilter = EventFilter as EventFilterConstructor;
diff --git a/src/lib/generated/classes/event-source.ts b/src/lib/generated/classes/event-source.ts
new file mode 100644
index 00000000..595ee33f
--- /dev/null
+++ b/src/lib/generated/classes/event-source.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the EventSource class and type
+ */
+export type EventSourceIntersection = EventSource & Specification.EventSource;
+
+/**
+ * Represents a constructor for the intersection of the EventSource class and type
+ */
+export interface EventSourceConstructor {
+  new (model?: Partial): EventSourceIntersection;
+}
+
+/**
+ * Represents a EventSource with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class EventSource extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the EventSource class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the EventSource.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('EventSource')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the EventSource.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new EventSource(this as any) as EventSourceIntersection;
+    validate('EventSource', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the EventSource.
+   * Creates a copy of the EventSource, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the EventSource instance.
+   */
+  normalize(): EventSource & Specification.EventSource {
+    const copy = new EventSource(this as any) as EventSourceIntersection;
+    return getLifecycleHooks('EventSource')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _EventSource = EventSource as EventSourceConstructor;
diff --git a/src/lib/generated/classes/event-time.ts b/src/lib/generated/classes/event-time.ts
new file mode 100644
index 00000000..114daa36
--- /dev/null
+++ b/src/lib/generated/classes/event-time.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the EventTime class and type
+ */
+export type EventTimeIntersection = EventTime & Specification.EventTime;
+
+/**
+ * Represents a constructor for the intersection of the EventTime class and type
+ */
+export interface EventTimeConstructor {
+  new (model?: Partial): EventTimeIntersection;
+}
+
+/**
+ * Represents a EventTime with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class EventTime extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the EventTime class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the EventTime.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('EventTime')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the EventTime.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new EventTime(this as any) as EventTimeIntersection;
+    validate('EventTime', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the EventTime.
+   * Creates a copy of the EventTime, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the EventTime instance.
+   */
+  normalize(): EventTime & Specification.EventTime {
+    const copy = new EventTime(this as any) as EventTimeIntersection;
+    return getLifecycleHooks('EventTime')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _EventTime = EventTime as EventTimeConstructor;
diff --git a/src/lib/generated/classes/exponential-back-off.ts b/src/lib/generated/classes/exponential-back-off.ts
new file mode 100644
index 00000000..a83adade
--- /dev/null
+++ b/src/lib/generated/classes/exponential-back-off.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the ExponentialBackOff class and type
+ */
+export type ExponentialBackOffIntersection = ExponentialBackOff & Specification.ExponentialBackOff;
+
+/**
+ * Represents a constructor for the intersection of the ExponentialBackOff class and type
+ */
+export interface ExponentialBackOffConstructor {
+  new (model?: Partial): ExponentialBackOffIntersection;
+}
+
+/**
+ * Represents a ExponentialBackOff with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ExponentialBackOff extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the ExponentialBackOff class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ExponentialBackOff.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('ExponentialBackOff')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ExponentialBackOff.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ExponentialBackOff(this as any) as ExponentialBackOffIntersection;
+    validate('ExponentialBackOff', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ExponentialBackOff.
+   * Creates a copy of the ExponentialBackOff, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ExponentialBackOff instance.
+   */
+  normalize(): ExponentialBackOff & Specification.ExponentialBackOff {
+    const copy = new ExponentialBackOff(this as any) as ExponentialBackOffIntersection;
+    return getLifecycleHooks('ExponentialBackOff')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ExponentialBackOff = ExponentialBackOff as ExponentialBackOffConstructor;
diff --git a/src/lib/generated/classes/export-as.ts b/src/lib/generated/classes/export-as.ts
new file mode 100644
index 00000000..64d67d36
--- /dev/null
+++ b/src/lib/generated/classes/export-as.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the ExportAs class and type
+ */
+export type ExportAsIntersection = ExportAs & Specification.ExportAs;
+
+/**
+ * Represents a constructor for the intersection of the ExportAs class and type
+ */
+export interface ExportAsConstructor {
+  new (model?: Partial): ExportAsIntersection;
+}
+
+/**
+ * Represents a ExportAs with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ExportAs extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the ExportAs class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ExportAs.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('ExportAs')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ExportAs.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ExportAs(this as any) as ExportAsIntersection;
+    validate('ExportAs', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ExportAs.
+   * Creates a copy of the ExportAs, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ExportAs instance.
+   */
+  normalize(): ExportAs & Specification.ExportAs {
+    const copy = new ExportAs(this as any) as ExportAsIntersection;
+    return getLifecycleHooks('ExportAs')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ExportAs = ExportAs as ExportAsConstructor;
diff --git a/src/lib/generated/classes/export.ts b/src/lib/generated/classes/export.ts
new file mode 100644
index 00000000..fc645f61
--- /dev/null
+++ b/src/lib/generated/classes/export.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Schema } from './schema';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the Export class and type
+ */
+export type ExportIntersection = Export & Specification.Export;
+
+/**
+ * Represents a constructor for the intersection of the Export class and type
+ */
+export interface ExportConstructor {
+  new (model?: Partial): ExportIntersection;
+}
+
+/**
+ * Represents a Export with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class Export extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the Export class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the Export.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.Export & object;
+    if (isObject(model)) {
+      if (typeof model.schema === 'object') self.schema = new _Schema(model.schema);
+    }
+    getLifecycleHooks('Export')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the Export.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new Export(this as any) as ExportIntersection;
+    validate('Export', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the Export.
+   * Creates a copy of the Export, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the Export instance.
+   */
+  normalize(): Export & Specification.Export {
+    const copy = new Export(this as any) as ExportIntersection;
+    return getLifecycleHooks('Export')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _Export = Export as ExportConstructor;
diff --git a/src/lib/generated/classes/extension-item.ts b/src/lib/generated/classes/extension-item.ts
new file mode 100644
index 00000000..8fb07d68
--- /dev/null
+++ b/src/lib/generated/classes/extension-item.ts
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Extension } from './extension';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the ExtensionItem class and type
+ */
+export type ExtensionItemIntersection = ExtensionItem & Specification.ExtensionItem;
+
+/**
+ * Represents a constructor for the intersection of the ExtensionItem class and type
+ */
+export interface ExtensionItemConstructor {
+  new (model?: Partial): ExtensionItemIntersection;
+}
+
+/**
+ * Represents a ExtensionItem with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ExtensionItem extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the ExtensionItem class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ExtensionItem.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.ExtensionItem & object;
+    if (isObject(model)) {
+      const knownProperties: string[] = [];
+      Object.entries(model)
+        .filter(([key]) => !knownProperties.includes(key))
+        .forEach(([key, value]) => {
+          self[key] = new _Extension(value);
+        });
+    }
+    getLifecycleHooks('ExtensionItem')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ExtensionItem.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ExtensionItem(this as any) as ExtensionItemIntersection;
+    validate('ExtensionItem', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ExtensionItem.
+   * Creates a copy of the ExtensionItem, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ExtensionItem instance.
+   */
+  normalize(): ExtensionItem & Specification.ExtensionItem {
+    const copy = new ExtensionItem(this as any) as ExtensionItemIntersection;
+    return getLifecycleHooks('ExtensionItem')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ExtensionItem = ExtensionItem as ExtensionItemConstructor;
diff --git a/src/lib/generated/classes/extension.ts b/src/lib/generated/classes/extension.ts
new file mode 100644
index 00000000..c742e43f
--- /dev/null
+++ b/src/lib/generated/classes/extension.ts
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _TaskList } from './task-list';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the Extension class and type
+ */
+export type ExtensionIntersection = Extension & Specification.Extension;
+
+/**
+ * Represents a constructor for the intersection of the Extension class and type
+ */
+export interface ExtensionConstructor {
+  new (model?: Partial): ExtensionIntersection;
+}
+
+/**
+ * Represents a Extension with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class Extension extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the Extension class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the Extension.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.Extension & object;
+    if (isObject(model)) {
+      if (typeof model.before === 'object') self.before = new _TaskList(model.before);
+      if (typeof model.after === 'object') self.after = new _TaskList(model.after);
+    }
+    getLifecycleHooks('Extension')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the Extension.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new Extension(this as any) as ExtensionIntersection;
+    validate('Extension', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the Extension.
+   * Creates a copy of the Extension, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the Extension instance.
+   */
+  normalize(): Extension & Specification.Extension {
+    const copy = new Extension(this as any) as ExtensionIntersection;
+    return getLifecycleHooks('Extension')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _Extension = Extension as ExtensionConstructor;
diff --git a/src/lib/generated/classes/external-resource.ts b/src/lib/generated/classes/external-resource.ts
new file mode 100644
index 00000000..0cc08f38
--- /dev/null
+++ b/src/lib/generated/classes/external-resource.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Endpoint } from './endpoint';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the ExternalResource class and type
+ */
+export type ExternalResourceIntersection = ExternalResource & Specification.ExternalResource;
+
+/**
+ * Represents a constructor for the intersection of the ExternalResource class and type
+ */
+export interface ExternalResourceConstructor {
+  new (model?: Partial): ExternalResourceIntersection;
+}
+
+/**
+ * Represents a ExternalResource with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ExternalResource extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the ExternalResource class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ExternalResource.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.ExternalResource & object;
+    if (isObject(model)) {
+      if (typeof model.endpoint === 'object') self.endpoint = new _Endpoint(model.endpoint);
+    }
+    getLifecycleHooks('ExternalResource')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ExternalResource.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ExternalResource(this as any) as ExternalResourceIntersection;
+    validate('ExternalResource', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ExternalResource.
+   * Creates a copy of the ExternalResource, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ExternalResource instance.
+   */
+  normalize(): ExternalResource & Specification.ExternalResource {
+    const copy = new ExternalResource(this as any) as ExternalResourceIntersection;
+    return getLifecycleHooks('ExternalResource')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ExternalResource = ExternalResource as ExternalResourceConstructor;
diff --git a/src/lib/generated/classes/external-script.ts b/src/lib/generated/classes/external-script.ts
new file mode 100644
index 00000000..71bfdcba
--- /dev/null
+++ b/src/lib/generated/classes/external-script.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _ExternalResource } from './external-resource';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the ExternalScript class and type
+ */
+export type ExternalScriptIntersection = ExternalScript & Specification.ExternalScript;
+
+/**
+ * Represents a constructor for the intersection of the ExternalScript class and type
+ */
+export interface ExternalScriptConstructor {
+  new (model?: Partial): ExternalScriptIntersection;
+}
+
+/**
+ * Represents a ExternalScript with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ExternalScript extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the ExternalScript class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ExternalScript.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.ExternalScript & object;
+    if (isObject(model)) {
+      if (typeof model.source === 'object') self.source = new _ExternalResource(model.source);
+    }
+    getLifecycleHooks('ExternalScript')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ExternalScript.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ExternalScript(this as any) as ExternalScriptIntersection;
+    validate('ExternalScript', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ExternalScript.
+   * Creates a copy of the ExternalScript, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ExternalScript instance.
+   */
+  normalize(): ExternalScript & Specification.ExternalScript {
+    const copy = new ExternalScript(this as any) as ExternalScriptIntersection;
+    return getLifecycleHooks('ExternalScript')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ExternalScript = ExternalScript as ExternalScriptConstructor;
diff --git a/src/lib/generated/classes/flow-directive.ts b/src/lib/generated/classes/flow-directive.ts
new file mode 100644
index 00000000..6366f156
--- /dev/null
+++ b/src/lib/generated/classes/flow-directive.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the FlowDirective class and type
+ */
+export type FlowDirectiveIntersection = FlowDirective & Specification.FlowDirective;
+
+/**
+ * Represents a constructor for the intersection of the FlowDirective class and type
+ */
+export interface FlowDirectiveConstructor {
+  new (model?: Partial): FlowDirectiveIntersection;
+}
+
+/**
+ * Represents a FlowDirective with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class FlowDirective extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the FlowDirective class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the FlowDirective.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('FlowDirective')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the FlowDirective.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new FlowDirective(this as any) as FlowDirectiveIntersection;
+    validate('FlowDirective', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the FlowDirective.
+   * Creates a copy of the FlowDirective, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the FlowDirective instance.
+   */
+  normalize(): FlowDirective & Specification.FlowDirective {
+    const copy = new FlowDirective(this as any) as FlowDirectiveIntersection;
+    return getLifecycleHooks('FlowDirective')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _FlowDirective = FlowDirective as FlowDirectiveConstructor;
diff --git a/src/lib/generated/classes/for-task-configuration.ts b/src/lib/generated/classes/for-task-configuration.ts
new file mode 100644
index 00000000..3588b7f5
--- /dev/null
+++ b/src/lib/generated/classes/for-task-configuration.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the ForTaskConfiguration class and type
+ */
+export type ForTaskConfigurationIntersection = ForTaskConfiguration & Specification.ForTaskConfiguration;
+
+/**
+ * Represents a constructor for the intersection of the ForTaskConfiguration class and type
+ */
+export interface ForTaskConfigurationConstructor {
+  new (model?: Partial): ForTaskConfigurationIntersection;
+}
+
+/**
+ * Represents a ForTaskConfiguration with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ForTaskConfiguration extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the ForTaskConfiguration class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ForTaskConfiguration.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('ForTaskConfiguration')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ForTaskConfiguration.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ForTaskConfiguration(this as any) as ForTaskConfigurationIntersection;
+    validate('ForTaskConfiguration', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ForTaskConfiguration.
+   * Creates a copy of the ForTaskConfiguration, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ForTaskConfiguration instance.
+   */
+  normalize(): ForTaskConfiguration & Specification.ForTaskConfiguration {
+    const copy = new ForTaskConfiguration(this as any) as ForTaskConfigurationIntersection;
+    return getLifecycleHooks('ForTaskConfiguration')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ForTaskConfiguration = ForTaskConfiguration as ForTaskConfigurationConstructor;
diff --git a/src/lib/generated/classes/for-task.ts b/src/lib/generated/classes/for-task.ts
new file mode 100644
index 00000000..c36eb125
--- /dev/null
+++ b/src/lib/generated/classes/for-task.ts
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Input } from './input';
+import { _Output } from './output';
+import { _Export } from './export';
+import { _TaskTimeout } from './task-timeout';
+import { _TaskMetadata } from './task-metadata';
+import { _ForTaskConfiguration } from './for-task-configuration';
+import { _TaskList } from './task-list';
+import { _TaskBase } from './task-base';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the ForTask class and type
+ */
+export type ForTaskIntersection = ForTask & Specification.ForTask;
+
+/**
+ * Represents a constructor for the intersection of the ForTask class and type
+ */
+export interface ForTaskConstructor {
+  new (model?: Partial): ForTaskIntersection;
+}
+
+/**
+ * Represents a ForTask with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ForTask extends _TaskBase {
+  /**
+   * Instanciates a new instance of the ForTask class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ForTask.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.ForTask & object;
+    if (isObject(model)) {
+      if (typeof model.input === 'object') self.input = new _Input(model.input);
+      if (typeof model.output === 'object') self.output = new _Output(model.output);
+      if (typeof model.export === 'object') self.export = new _Export(model.export);
+      if (typeof model.timeout === 'object') self.timeout = new _TaskTimeout(model.timeout);
+      if (typeof model.metadata === 'object') self.metadata = new _TaskMetadata(model.metadata);
+      if (typeof model.for === 'object') self.for = new _ForTaskConfiguration(model.for);
+      if (typeof model.do === 'object') self.do = new _TaskList(model.do);
+    }
+    getLifecycleHooks('ForTask')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ForTask.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ForTask(this as any) as ForTaskIntersection;
+    validate('ForTask', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ForTask.
+   * Creates a copy of the ForTask, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ForTask instance.
+   */
+  normalize(): ForTask & Specification.ForTask {
+    const copy = new ForTask(this as any) as ForTaskIntersection;
+    return getLifecycleHooks('ForTask')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ForTask = ForTask as ForTaskConstructor;
diff --git a/src/lib/generated/classes/fork-task-configuration.ts b/src/lib/generated/classes/fork-task-configuration.ts
new file mode 100644
index 00000000..3f78d588
--- /dev/null
+++ b/src/lib/generated/classes/fork-task-configuration.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _TaskList } from './task-list';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the ForkTaskConfiguration class and type
+ */
+export type ForkTaskConfigurationIntersection = ForkTaskConfiguration & Specification.ForkTaskConfiguration;
+
+/**
+ * Represents a constructor for the intersection of the ForkTaskConfiguration class and type
+ */
+export interface ForkTaskConfigurationConstructor {
+  new (model?: Partial): ForkTaskConfigurationIntersection;
+}
+
+/**
+ * Represents a ForkTaskConfiguration with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ForkTaskConfiguration extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the ForkTaskConfiguration class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ForkTaskConfiguration.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.ForkTaskConfiguration & object;
+    if (isObject(model)) {
+      if (typeof model.branches === 'object') self.branches = new _TaskList(model.branches);
+    }
+    getLifecycleHooks('ForkTaskConfiguration')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ForkTaskConfiguration.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ForkTaskConfiguration(this as any) as ForkTaskConfigurationIntersection;
+    validate('ForkTaskConfiguration', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ForkTaskConfiguration.
+   * Creates a copy of the ForkTaskConfiguration, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ForkTaskConfiguration instance.
+   */
+  normalize(): ForkTaskConfiguration & Specification.ForkTaskConfiguration {
+    const copy = new ForkTaskConfiguration(this as any) as ForkTaskConfigurationIntersection;
+    return getLifecycleHooks('ForkTaskConfiguration')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ForkTaskConfiguration = ForkTaskConfiguration as ForkTaskConfigurationConstructor;
diff --git a/src/lib/generated/classes/fork-task.ts b/src/lib/generated/classes/fork-task.ts
new file mode 100644
index 00000000..1228a679
--- /dev/null
+++ b/src/lib/generated/classes/fork-task.ts
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Input } from './input';
+import { _Output } from './output';
+import { _Export } from './export';
+import { _TaskTimeout } from './task-timeout';
+import { _TaskMetadata } from './task-metadata';
+import { _ForkTaskConfiguration } from './fork-task-configuration';
+import { _TaskBase } from './task-base';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the ForkTask class and type
+ */
+export type ForkTaskIntersection = ForkTask & Specification.ForkTask;
+
+/**
+ * Represents a constructor for the intersection of the ForkTask class and type
+ */
+export interface ForkTaskConstructor {
+  new (model?: Partial): ForkTaskIntersection;
+}
+
+/**
+ * Represents a ForkTask with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ForkTask extends _TaskBase {
+  /**
+   * Instanciates a new instance of the ForkTask class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ForkTask.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.ForkTask & object;
+    if (isObject(model)) {
+      if (typeof model.input === 'object') self.input = new _Input(model.input);
+      if (typeof model.output === 'object') self.output = new _Output(model.output);
+      if (typeof model.export === 'object') self.export = new _Export(model.export);
+      if (typeof model.timeout === 'object') self.timeout = new _TaskTimeout(model.timeout);
+      if (typeof model.metadata === 'object') self.metadata = new _TaskMetadata(model.metadata);
+      if (typeof model.fork === 'object') self.fork = new _ForkTaskConfiguration(model.fork);
+    }
+    getLifecycleHooks('ForkTask')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ForkTask.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ForkTask(this as any) as ForkTaskIntersection;
+    validate('ForkTask', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ForkTask.
+   * Creates a copy of the ForkTask, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ForkTask instance.
+   */
+  normalize(): ForkTask & Specification.ForkTask {
+    const copy = new ForkTask(this as any) as ForkTaskIntersection;
+    return getLifecycleHooks('ForkTask')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ForkTask = ForkTask as ForkTaskConstructor;
diff --git a/src/lib/generated/classes/function-arguments.ts b/src/lib/generated/classes/function-arguments.ts
new file mode 100644
index 00000000..7e676229
--- /dev/null
+++ b/src/lib/generated/classes/function-arguments.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the FunctionArguments class and type
+ */
+export type FunctionArgumentsIntersection = FunctionArguments & Specification.FunctionArguments;
+
+/**
+ * Represents a constructor for the intersection of the FunctionArguments class and type
+ */
+export interface FunctionArgumentsConstructor {
+  new (model?: Partial): FunctionArgumentsIntersection;
+}
+
+/**
+ * Represents a FunctionArguments with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class FunctionArguments extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the FunctionArguments class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the FunctionArguments.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('FunctionArguments')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the FunctionArguments.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new FunctionArguments(this as any) as FunctionArgumentsIntersection;
+    validate('FunctionArguments', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the FunctionArguments.
+   * Creates a copy of the FunctionArguments, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the FunctionArguments instance.
+   */
+  normalize(): FunctionArguments & Specification.FunctionArguments {
+    const copy = new FunctionArguments(this as any) as FunctionArgumentsIntersection;
+    return getLifecycleHooks('FunctionArguments')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _FunctionArguments = FunctionArguments as FunctionArgumentsConstructor;
diff --git a/src/lib/generated/classes/grpc-arguments.ts b/src/lib/generated/classes/grpc-arguments.ts
new file mode 100644
index 00000000..86de5bf2
--- /dev/null
+++ b/src/lib/generated/classes/grpc-arguments.ts
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _ExternalResource } from './external-resource';
+import { _WithGRPCService } from './with-grpc-service';
+import { _WithGRPCArguments } from './with-grpc-arguments';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the GRPCArguments class and type
+ */
+export type GRPCArgumentsIntersection = GRPCArguments & Specification.GRPCArguments;
+
+/**
+ * Represents a constructor for the intersection of the GRPCArguments class and type
+ */
+export interface GRPCArgumentsConstructor {
+  new (model?: Partial): GRPCArgumentsIntersection;
+}
+
+/**
+ * Represents a GRPCArguments with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class GRPCArguments extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the GRPCArguments class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the GRPCArguments.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.GRPCArguments & object;
+    if (isObject(model)) {
+      if (typeof model.proto === 'object') self.proto = new _ExternalResource(model.proto);
+      if (typeof model.service === 'object') self.service = new _WithGRPCService(model.service);
+      if (typeof model.arguments === 'object') self.arguments = new _WithGRPCArguments(model.arguments);
+    }
+    getLifecycleHooks('GRPCArguments')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the GRPCArguments.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new GRPCArguments(this as any) as GRPCArgumentsIntersection;
+    validate('GRPCArguments', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the GRPCArguments.
+   * Creates a copy of the GRPCArguments, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the GRPCArguments instance.
+   */
+  normalize(): GRPCArguments & Specification.GRPCArguments {
+    const copy = new GRPCArguments(this as any) as GRPCArgumentsIntersection;
+    return getLifecycleHooks('GRPCArguments')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _GRPCArguments = GRPCArguments as GRPCArgumentsConstructor;
diff --git a/src/lib/generated/classes/http-arguments.ts b/src/lib/generated/classes/http-arguments.ts
new file mode 100644
index 00000000..858c6b64
--- /dev/null
+++ b/src/lib/generated/classes/http-arguments.ts
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Endpoint } from './endpoint';
+import { _HTTPHeaders } from './http-headers';
+import { _HTTPBody } from './http-body';
+import { _HTTPQuery } from './http-query';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the HTTPArguments class and type
+ */
+export type HTTPArgumentsIntersection = HTTPArguments & Specification.HTTPArguments;
+
+/**
+ * Represents a constructor for the intersection of the HTTPArguments class and type
+ */
+export interface HTTPArgumentsConstructor {
+  new (model?: Partial): HTTPArgumentsIntersection;
+}
+
+/**
+ * Represents a HTTPArguments with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class HTTPArguments extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the HTTPArguments class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the HTTPArguments.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.HTTPArguments & object;
+    if (isObject(model)) {
+      if (typeof model.endpoint === 'object') self.endpoint = new _Endpoint(model.endpoint);
+      if (typeof model.headers === 'object') self.headers = new _HTTPHeaders(model.headers);
+      if (typeof model.body === 'object') self.body = new _HTTPBody(model.body);
+      if (typeof model.query === 'object') self.query = new _HTTPQuery(model.query);
+    }
+    getLifecycleHooks('HTTPArguments')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the HTTPArguments.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new HTTPArguments(this as any) as HTTPArgumentsIntersection;
+    validate('HTTPArguments', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the HTTPArguments.
+   * Creates a copy of the HTTPArguments, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the HTTPArguments instance.
+   */
+  normalize(): HTTPArguments & Specification.HTTPArguments {
+    const copy = new HTTPArguments(this as any) as HTTPArgumentsIntersection;
+    return getLifecycleHooks('HTTPArguments')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _HTTPArguments = HTTPArguments as HTTPArgumentsConstructor;
diff --git a/src/lib/generated/classes/http-body.ts b/src/lib/generated/classes/http-body.ts
new file mode 100644
index 00000000..641baad6
--- /dev/null
+++ b/src/lib/generated/classes/http-body.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the HTTPBody class and type
+ */
+export type HTTPBodyIntersection = HTTPBody & Specification.HTTPBody;
+
+/**
+ * Represents a constructor for the intersection of the HTTPBody class and type
+ */
+export interface HTTPBodyConstructor {
+  new (model?: Partial): HTTPBodyIntersection;
+}
+
+/**
+ * Represents a HTTPBody with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class HTTPBody extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the HTTPBody class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the HTTPBody.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('HTTPBody')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the HTTPBody.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new HTTPBody(this as any) as HTTPBodyIntersection;
+    validate('HTTPBody', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the HTTPBody.
+   * Creates a copy of the HTTPBody, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the HTTPBody instance.
+   */
+  normalize(): HTTPBody & Specification.HTTPBody {
+    const copy = new HTTPBody(this as any) as HTTPBodyIntersection;
+    return getLifecycleHooks('HTTPBody')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _HTTPBody = HTTPBody as HTTPBodyConstructor;
diff --git a/src/lib/generated/classes/http-headers.ts b/src/lib/generated/classes/http-headers.ts
new file mode 100644
index 00000000..002f5f87
--- /dev/null
+++ b/src/lib/generated/classes/http-headers.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the HTTPHeaders class and type
+ */
+export type HTTPHeadersIntersection = HTTPHeaders & Specification.HTTPHeaders;
+
+/**
+ * Represents a constructor for the intersection of the HTTPHeaders class and type
+ */
+export interface HTTPHeadersConstructor {
+  new (model?: Partial): HTTPHeadersIntersection;
+}
+
+/**
+ * Represents a HTTPHeaders with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class HTTPHeaders extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the HTTPHeaders class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the HTTPHeaders.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('HTTPHeaders')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the HTTPHeaders.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new HTTPHeaders(this as any) as HTTPHeadersIntersection;
+    validate('HTTPHeaders', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the HTTPHeaders.
+   * Creates a copy of the HTTPHeaders, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the HTTPHeaders instance.
+   */
+  normalize(): HTTPHeaders & Specification.HTTPHeaders {
+    const copy = new HTTPHeaders(this as any) as HTTPHeadersIntersection;
+    return getLifecycleHooks('HTTPHeaders')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _HTTPHeaders = HTTPHeaders as HTTPHeadersConstructor;
diff --git a/src/lib/generated/classes/http-query.ts b/src/lib/generated/classes/http-query.ts
new file mode 100644
index 00000000..25918322
--- /dev/null
+++ b/src/lib/generated/classes/http-query.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the HTTPQuery class and type
+ */
+export type HTTPQueryIntersection = HTTPQuery & Specification.HTTPQuery;
+
+/**
+ * Represents a constructor for the intersection of the HTTPQuery class and type
+ */
+export interface HTTPQueryConstructor {
+  new (model?: Partial): HTTPQueryIntersection;
+}
+
+/**
+ * Represents a HTTPQuery with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class HTTPQuery extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the HTTPQuery class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the HTTPQuery.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('HTTPQuery')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the HTTPQuery.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new HTTPQuery(this as any) as HTTPQueryIntersection;
+    validate('HTTPQuery', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the HTTPQuery.
+   * Creates a copy of the HTTPQuery, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the HTTPQuery instance.
+   */
+  normalize(): HTTPQuery & Specification.HTTPQuery {
+    const copy = new HTTPQuery(this as any) as HTTPQueryIntersection;
+    return getLifecycleHooks('HTTPQuery')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _HTTPQuery = HTTPQuery as HTTPQueryConstructor;
diff --git a/src/lib/generated/classes/index.ts b/src/lib/generated/classes/index.ts
new file mode 100644
index 00000000..66dbf744
--- /dev/null
+++ b/src/lib/generated/classes/index.ts
@@ -0,0 +1,339 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { _AllEventConsumptionStrategy } from './all-event-consumption-strategy';
+import { _AllEventConsumptionStrategyConfiguration } from './all-event-consumption-strategy-configuration';
+import { _AnyEventConsumptionStrategy } from './any-event-consumption-strategy';
+import { _AnyEventConsumptionStrategyConfiguration } from './any-event-consumption-strategy-configuration';
+import { _AnyEventConsumptionStrategyUntil } from './any-event-consumption-strategy-until';
+import { _AnyEventUntilConsumed } from './any-event-until-consumed';
+import { _AsyncApiArguments } from './async-api-arguments';
+import { _AuthenticationPolicy } from './authentication-policy';
+import { _AuthenticationPolicyReference } from './authentication-policy-reference';
+import { _BasicAuthenticationPolicy } from './basic-authentication-policy';
+import { _BasicAuthenticationPolicyConfiguration } from './basic-authentication-policy-configuration';
+import { _BasicAuthenticationProperties } from './basic-authentication-properties';
+import { _BearerAuthenticationPolicy } from './bearer-authentication-policy';
+import { _BearerAuthenticationPolicyConfiguration } from './bearer-authentication-policy-configuration';
+import { _BearerAuthenticationProperties } from './bearer-authentication-properties';
+import { _CallAsyncAPI } from './call-async-api';
+import { _CallFunction } from './call-function';
+import { _CallGRPC } from './call-grpc';
+import { _CallHTTP } from './call-http';
+import { _CallOpenAPI } from './call-open-api';
+import { _CallTask } from './call-task';
+import { _Catalog } from './catalog';
+import { _CatchErrors } from './catch-errors';
+import { _ConstantBackoff } from './constant-backoff';
+import { _Container } from './container';
+import { _ContainerEnvironment } from './container-environment';
+import { _ContainerLifetime } from './container-lifetime';
+import { _ContainerPorts } from './container-ports';
+import { _ContainerVolumes } from './container-volumes';
+import { _DigestAuthenticationPolicy } from './digest-authentication-policy';
+import { _DigestAuthenticationPolicyConfiguration } from './digest-authentication-policy-configuration';
+import { _DigestAuthenticationProperties } from './digest-authentication-properties';
+import { _Document } from './document';
+import { _DoTask } from './do-task';
+import { _Duration } from './duration';
+import { _DurationInline } from './duration-inline';
+import { _EmitEventDefinition } from './emit-event-definition';
+import { _EmitEventWith } from './emit-event-with';
+import { _EmitTask } from './emit-task';
+import { _EmitTaskConfiguration } from './emit-task-configuration';
+import { _Endpoint } from './endpoint';
+import { _EndpointConfiguration } from './endpoint-configuration';
+import { _EndpointUri } from './endpoint-uri';
+import { _Error } from './error';
+import { _ErrorFilter } from './error-filter';
+import { _ErrorInstance } from './error-instance';
+import { _ErrorType } from './error-type';
+import { _EventConsumptionStrategy } from './event-consumption-strategy';
+import { _EventData } from './event-data';
+import { _EventDataschema } from './event-dataschema';
+import { _EventFilter } from './event-filter';
+import { _EventFilterCorrelate } from './event-filter-correlate';
+import { _EventSource } from './event-source';
+import { _EventTime } from './event-time';
+import { _ExponentialBackOff } from './exponential-back-off';
+import { _Export } from './export';
+import { _ExportAs } from './export-as';
+import { _Extension } from './extension';
+import { _ExtensionItem } from './extension-item';
+import { _ExternalResource } from './external-resource';
+import { _ExternalScript } from './external-script';
+import { _FlowDirective } from './flow-directive';
+import { _ForkTask } from './fork-task';
+import { _ForkTaskConfiguration } from './fork-task-configuration';
+import { _ForTask } from './for-task';
+import { _ForTaskConfiguration } from './for-task-configuration';
+import { _FunctionArguments } from './function-arguments';
+import { _GRPCArguments } from './grpc-arguments';
+import { _HTTPArguments } from './http-arguments';
+import { _HTTPBody } from './http-body';
+import { _HTTPHeaders } from './http-headers';
+import { _HTTPQuery } from './http-query';
+import { _InlineScript } from './inline-script';
+import { _Input } from './input';
+import { _InputFrom } from './input-from';
+import { _LinearBackoff } from './linear-backoff';
+import { _ListenTask } from './listen-task';
+import { _ListenTaskConfiguration } from './listen-task-configuration';
+import { _OAuth2AutenthicationData } from './oauth2-autenthication-data';
+import { _OAuth2AutenthicationDataAudiences } from './oauth2-autenthication-data-audiences';
+import { _OAuth2AutenthicationDataClient } from './oauth2-autenthication-data-client';
+import { _OAuth2AutenthicationDataScopes } from './oauth2-autenthication-data-scopes';
+import { _OAuth2AuthenticationPolicy } from './oauth2-authentication-policy';
+import { _OAuth2AuthenticationPolicyConfiguration } from './oauth2-authentication-policy-configuration';
+import { _OAuth2AuthenticationPropertiesEndpoints } from './oauth2-authentication-properties-endpoints';
+import { _OAuth2ConnectAuthenticationProperties } from './oauth2-connect-authentication-properties';
+import { _OAuth2Issuers } from './oauth2-issuers';
+import { _OAuth2TokenDefinition } from './oauth2-token-definition';
+import { _OAuth2TokenRequest } from './oauth2-token-request';
+import { _OneEventConsumptionStrategy } from './one-event-consumption-strategy';
+import { _OpenAPIArguments } from './open-api-arguments';
+import { _OpenIdConnectAuthenticationPolicy } from './open-id-connect-authentication-policy';
+import { _OpenIdConnectAuthenticationPolicyConfiguration } from './open-id-connect-authentication-policy-configuration';
+import { _OpenIdConnectAuthenticationProperties } from './open-id-connect-authentication-properties';
+import { _Output } from './output';
+import { _OutputAs } from './output-as';
+import { _RaiseTask } from './raise-task';
+import { _RaiseTaskConfiguration } from './raise-task-configuration';
+import { _RaiseTaskError } from './raise-task-error';
+import { _ReferenceableAuthenticationPolicy } from './referenceable-authentication-policy';
+import { _RetryBackoff } from './retry-backoff';
+import { _RetryLimit } from './retry-limit';
+import { _RetryLimitAttempt } from './retry-limit-attempt';
+import { _RetryPolicy } from './retry-policy';
+import { _RetryPolicyJitter } from './retry-policy-jitter';
+import { _RunContainer } from './run-container';
+import { _RunScript } from './run-script';
+import { _RunShell } from './run-shell';
+import { _RunTask } from './run-task';
+import { _RunTaskConfiguration } from './run-task-configuration';
+import { _RuntimeExpression } from './runtime-expression';
+import { _RunWorkflow } from './run-workflow';
+import { _Schedule } from './schedule';
+import { _Schema } from './schema';
+import { _SchemaExternal } from './schema-external';
+import { _SchemaInline } from './schema-inline';
+import { _Script } from './script';
+import { _SecretBasedAuthenticationPolicy } from './secret-based-authentication-policy';
+import { _SetTask } from './set-task';
+import { _SetTaskConfiguration } from './set-task-configuration';
+import { _Shell } from './shell';
+import { _ShellArguments } from './shell-arguments';
+import { _ShellEnvironment } from './shell-environment';
+import { _SubflowConfiguration } from './subflow-configuration';
+import { _SubflowInput } from './subflow-input';
+import { _SubscriptionIterator } from './subscription-iterator';
+import { _SwitchCase } from './switch-case';
+import { _SwitchItem } from './switch-item';
+import { _SwitchTask } from './switch-task';
+import { _SwitchTaskConfiguration } from './switch-task-configuration';
+import { _Task } from './task';
+import { _TaskBase } from './task-base';
+import { _TaskBaseIf } from './task-base-if';
+import { _TaskItem } from './task-item';
+import { _TaskList } from './task-list';
+import { _TaskMetadata } from './task-metadata';
+import { _TaskTimeout } from './task-timeout';
+import { _Timeout } from './timeout';
+import { _TryTask } from './try-task';
+import { _TryTaskCatch } from './try-task-catch';
+import { _TryTaskCatchRetry } from './try-task-catch-retry';
+import { _UriTemplate } from './uri-template';
+import { _Use } from './use';
+import { _UseAuthentications } from './use-authentications';
+import { _UseCatalogs } from './use-catalogs';
+import { _UseErrors } from './use-errors';
+import { _UseExtensions } from './use-extensions';
+import { _UseFunctions } from './use-functions';
+import { _UseRetries } from './use-retries';
+import { _UseSecrets } from './use-secrets';
+import { _UseTimeouts } from './use-timeouts';
+import { _WaitTask } from './wait-task';
+import { _WithEvent } from './with-event';
+import { _WithGRPCArguments } from './with-grpc-arguments';
+import { _WithGRPCService } from './with-grpc-service';
+import { _WithOpenAPIParameters } from './with-open-api-parameters';
+import { _Workflow } from './workflow';
+import { _WorkflowMetadata } from './workflow-metadata';
+import { _WorkflowTags } from './workflow-tags';
+import { _WorkflowTimeout } from './workflow-timeout';
+
+export const Classes = {
+  AllEventConsumptionStrategy: _AllEventConsumptionStrategy,
+  AllEventConsumptionStrategyConfiguration: _AllEventConsumptionStrategyConfiguration,
+  AnyEventConsumptionStrategy: _AnyEventConsumptionStrategy,
+  AnyEventConsumptionStrategyConfiguration: _AnyEventConsumptionStrategyConfiguration,
+  AnyEventConsumptionStrategyUntil: _AnyEventConsumptionStrategyUntil,
+  AnyEventUntilConsumed: _AnyEventUntilConsumed,
+  AsyncApiArguments: _AsyncApiArguments,
+  AuthenticationPolicy: _AuthenticationPolicy,
+  AuthenticationPolicyReference: _AuthenticationPolicyReference,
+  BasicAuthenticationPolicy: _BasicAuthenticationPolicy,
+  BasicAuthenticationPolicyConfiguration: _BasicAuthenticationPolicyConfiguration,
+  BasicAuthenticationProperties: _BasicAuthenticationProperties,
+  BearerAuthenticationPolicy: _BearerAuthenticationPolicy,
+  BearerAuthenticationPolicyConfiguration: _BearerAuthenticationPolicyConfiguration,
+  BearerAuthenticationProperties: _BearerAuthenticationProperties,
+  CallAsyncAPI: _CallAsyncAPI,
+  CallFunction: _CallFunction,
+  CallGRPC: _CallGRPC,
+  CallHTTP: _CallHTTP,
+  CallOpenAPI: _CallOpenAPI,
+  CallTask: _CallTask,
+  Catalog: _Catalog,
+  CatchErrors: _CatchErrors,
+  ConstantBackoff: _ConstantBackoff,
+  Container: _Container,
+  ContainerEnvironment: _ContainerEnvironment,
+  ContainerLifetime: _ContainerLifetime,
+  ContainerPorts: _ContainerPorts,
+  ContainerVolumes: _ContainerVolumes,
+  DigestAuthenticationPolicy: _DigestAuthenticationPolicy,
+  DigestAuthenticationPolicyConfiguration: _DigestAuthenticationPolicyConfiguration,
+  DigestAuthenticationProperties: _DigestAuthenticationProperties,
+  Document: _Document,
+  DoTask: _DoTask,
+  Duration: _Duration,
+  DurationInline: _DurationInline,
+  EmitEventDefinition: _EmitEventDefinition,
+  EmitEventWith: _EmitEventWith,
+  EmitTask: _EmitTask,
+  EmitTaskConfiguration: _EmitTaskConfiguration,
+  Endpoint: _Endpoint,
+  EndpointConfiguration: _EndpointConfiguration,
+  EndpointUri: _EndpointUri,
+  Error: _Error,
+  ErrorFilter: _ErrorFilter,
+  ErrorInstance: _ErrorInstance,
+  ErrorType: _ErrorType,
+  EventConsumptionStrategy: _EventConsumptionStrategy,
+  EventData: _EventData,
+  EventDataschema: _EventDataschema,
+  EventFilter: _EventFilter,
+  EventFilterCorrelate: _EventFilterCorrelate,
+  EventSource: _EventSource,
+  EventTime: _EventTime,
+  ExponentialBackOff: _ExponentialBackOff,
+  Export: _Export,
+  ExportAs: _ExportAs,
+  Extension: _Extension,
+  ExtensionItem: _ExtensionItem,
+  ExternalResource: _ExternalResource,
+  ExternalScript: _ExternalScript,
+  FlowDirective: _FlowDirective,
+  ForkTask: _ForkTask,
+  ForkTaskConfiguration: _ForkTaskConfiguration,
+  ForTask: _ForTask,
+  ForTaskConfiguration: _ForTaskConfiguration,
+  FunctionArguments: _FunctionArguments,
+  GRPCArguments: _GRPCArguments,
+  HTTPArguments: _HTTPArguments,
+  HTTPBody: _HTTPBody,
+  HTTPHeaders: _HTTPHeaders,
+  HTTPQuery: _HTTPQuery,
+  InlineScript: _InlineScript,
+  Input: _Input,
+  InputFrom: _InputFrom,
+  LinearBackoff: _LinearBackoff,
+  ListenTask: _ListenTask,
+  ListenTaskConfiguration: _ListenTaskConfiguration,
+  OAuth2AutenthicationData: _OAuth2AutenthicationData,
+  OAuth2AutenthicationDataAudiences: _OAuth2AutenthicationDataAudiences,
+  OAuth2AutenthicationDataClient: _OAuth2AutenthicationDataClient,
+  OAuth2AutenthicationDataScopes: _OAuth2AutenthicationDataScopes,
+  OAuth2AuthenticationPolicy: _OAuth2AuthenticationPolicy,
+  OAuth2AuthenticationPolicyConfiguration: _OAuth2AuthenticationPolicyConfiguration,
+  OAuth2AuthenticationPropertiesEndpoints: _OAuth2AuthenticationPropertiesEndpoints,
+  OAuth2ConnectAuthenticationProperties: _OAuth2ConnectAuthenticationProperties,
+  OAuth2Issuers: _OAuth2Issuers,
+  OAuth2TokenDefinition: _OAuth2TokenDefinition,
+  OAuth2TokenRequest: _OAuth2TokenRequest,
+  OneEventConsumptionStrategy: _OneEventConsumptionStrategy,
+  OpenAPIArguments: _OpenAPIArguments,
+  OpenIdConnectAuthenticationPolicy: _OpenIdConnectAuthenticationPolicy,
+  OpenIdConnectAuthenticationPolicyConfiguration: _OpenIdConnectAuthenticationPolicyConfiguration,
+  OpenIdConnectAuthenticationProperties: _OpenIdConnectAuthenticationProperties,
+  Output: _Output,
+  OutputAs: _OutputAs,
+  RaiseTask: _RaiseTask,
+  RaiseTaskConfiguration: _RaiseTaskConfiguration,
+  RaiseTaskError: _RaiseTaskError,
+  ReferenceableAuthenticationPolicy: _ReferenceableAuthenticationPolicy,
+  RetryBackoff: _RetryBackoff,
+  RetryLimit: _RetryLimit,
+  RetryLimitAttempt: _RetryLimitAttempt,
+  RetryPolicy: _RetryPolicy,
+  RetryPolicyJitter: _RetryPolicyJitter,
+  RunContainer: _RunContainer,
+  RunScript: _RunScript,
+  RunShell: _RunShell,
+  RunTask: _RunTask,
+  RunTaskConfiguration: _RunTaskConfiguration,
+  RuntimeExpression: _RuntimeExpression,
+  RunWorkflow: _RunWorkflow,
+  Schedule: _Schedule,
+  Schema: _Schema,
+  SchemaExternal: _SchemaExternal,
+  SchemaInline: _SchemaInline,
+  Script: _Script,
+  SecretBasedAuthenticationPolicy: _SecretBasedAuthenticationPolicy,
+  SetTask: _SetTask,
+  SetTaskConfiguration: _SetTaskConfiguration,
+  Shell: _Shell,
+  ShellArguments: _ShellArguments,
+  ShellEnvironment: _ShellEnvironment,
+  SubflowConfiguration: _SubflowConfiguration,
+  SubflowInput: _SubflowInput,
+  SubscriptionIterator: _SubscriptionIterator,
+  SwitchCase: _SwitchCase,
+  SwitchItem: _SwitchItem,
+  SwitchTask: _SwitchTask,
+  SwitchTaskConfiguration: _SwitchTaskConfiguration,
+  Task: _Task,
+  TaskBase: _TaskBase,
+  TaskBaseIf: _TaskBaseIf,
+  TaskItem: _TaskItem,
+  TaskList: _TaskList,
+  TaskMetadata: _TaskMetadata,
+  TaskTimeout: _TaskTimeout,
+  Timeout: _Timeout,
+  TryTask: _TryTask,
+  TryTaskCatch: _TryTaskCatch,
+  TryTaskCatchRetry: _TryTaskCatchRetry,
+  UriTemplate: _UriTemplate,
+  Use: _Use,
+  UseAuthentications: _UseAuthentications,
+  UseCatalogs: _UseCatalogs,
+  UseErrors: _UseErrors,
+  UseExtensions: _UseExtensions,
+  UseFunctions: _UseFunctions,
+  UseRetries: _UseRetries,
+  UseSecrets: _UseSecrets,
+  UseTimeouts: _UseTimeouts,
+  WaitTask: _WaitTask,
+  WithEvent: _WithEvent,
+  WithGRPCArguments: _WithGRPCArguments,
+  WithGRPCService: _WithGRPCService,
+  WithOpenAPIParameters: _WithOpenAPIParameters,
+  Workflow: _Workflow,
+  WorkflowMetadata: _WorkflowMetadata,
+  WorkflowTags: _WorkflowTags,
+  WorkflowTimeout: _WorkflowTimeout,
+};
diff --git a/src/lib/generated/classes/inline-script.ts b/src/lib/generated/classes/inline-script.ts
new file mode 100644
index 00000000..ea52b319
--- /dev/null
+++ b/src/lib/generated/classes/inline-script.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the InlineScript class and type
+ */
+export type InlineScriptIntersection = InlineScript & Specification.InlineScript;
+
+/**
+ * Represents a constructor for the intersection of the InlineScript class and type
+ */
+export interface InlineScriptConstructor {
+  new (model?: Partial): InlineScriptIntersection;
+}
+
+/**
+ * Represents a InlineScript with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class InlineScript extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the InlineScript class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the InlineScript.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('InlineScript')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the InlineScript.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new InlineScript(this as any) as InlineScriptIntersection;
+    validate('InlineScript', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the InlineScript.
+   * Creates a copy of the InlineScript, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the InlineScript instance.
+   */
+  normalize(): InlineScript & Specification.InlineScript {
+    const copy = new InlineScript(this as any) as InlineScriptIntersection;
+    return getLifecycleHooks('InlineScript')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _InlineScript = InlineScript as InlineScriptConstructor;
diff --git a/src/lib/generated/classes/input-from.ts b/src/lib/generated/classes/input-from.ts
new file mode 100644
index 00000000..6683b968
--- /dev/null
+++ b/src/lib/generated/classes/input-from.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the InputFrom class and type
+ */
+export type InputFromIntersection = InputFrom & Specification.InputFrom;
+
+/**
+ * Represents a constructor for the intersection of the InputFrom class and type
+ */
+export interface InputFromConstructor {
+  new (model?: Partial): InputFromIntersection;
+}
+
+/**
+ * Represents a InputFrom with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class InputFrom extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the InputFrom class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the InputFrom.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('InputFrom')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the InputFrom.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new InputFrom(this as any) as InputFromIntersection;
+    validate('InputFrom', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the InputFrom.
+   * Creates a copy of the InputFrom, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the InputFrom instance.
+   */
+  normalize(): InputFrom & Specification.InputFrom {
+    const copy = new InputFrom(this as any) as InputFromIntersection;
+    return getLifecycleHooks('InputFrom')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _InputFrom = InputFrom as InputFromConstructor;
diff --git a/src/lib/generated/classes/input.ts b/src/lib/generated/classes/input.ts
new file mode 100644
index 00000000..a8f8a22d
--- /dev/null
+++ b/src/lib/generated/classes/input.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Schema } from './schema';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the Input class and type
+ */
+export type InputIntersection = Input & Specification.Input;
+
+/**
+ * Represents a constructor for the intersection of the Input class and type
+ */
+export interface InputConstructor {
+  new (model?: Partial): InputIntersection;
+}
+
+/**
+ * Represents a Input with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class Input extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the Input class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the Input.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.Input & object;
+    if (isObject(model)) {
+      if (typeof model.schema === 'object') self.schema = new _Schema(model.schema);
+    }
+    getLifecycleHooks('Input')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the Input.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new Input(this as any) as InputIntersection;
+    validate('Input', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the Input.
+   * Creates a copy of the Input, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the Input instance.
+   */
+  normalize(): Input & Specification.Input {
+    const copy = new Input(this as any) as InputIntersection;
+    return getLifecycleHooks('Input')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _Input = Input as InputConstructor;
diff --git a/src/lib/generated/classes/linear-backoff.ts b/src/lib/generated/classes/linear-backoff.ts
new file mode 100644
index 00000000..069627ef
--- /dev/null
+++ b/src/lib/generated/classes/linear-backoff.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the LinearBackoff class and type
+ */
+export type LinearBackoffIntersection = LinearBackoff & Specification.LinearBackoff;
+
+/**
+ * Represents a constructor for the intersection of the LinearBackoff class and type
+ */
+export interface LinearBackoffConstructor {
+  new (model?: Partial): LinearBackoffIntersection;
+}
+
+/**
+ * Represents a LinearBackoff with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class LinearBackoff extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the LinearBackoff class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the LinearBackoff.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('LinearBackoff')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the LinearBackoff.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new LinearBackoff(this as any) as LinearBackoffIntersection;
+    validate('LinearBackoff', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the LinearBackoff.
+   * Creates a copy of the LinearBackoff, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the LinearBackoff instance.
+   */
+  normalize(): LinearBackoff & Specification.LinearBackoff {
+    const copy = new LinearBackoff(this as any) as LinearBackoffIntersection;
+    return getLifecycleHooks('LinearBackoff')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _LinearBackoff = LinearBackoff as LinearBackoffConstructor;
diff --git a/src/lib/generated/classes/listen-task-configuration.ts b/src/lib/generated/classes/listen-task-configuration.ts
new file mode 100644
index 00000000..1e47efe8
--- /dev/null
+++ b/src/lib/generated/classes/listen-task-configuration.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _EventConsumptionStrategy } from './event-consumption-strategy';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the ListenTaskConfiguration class and type
+ */
+export type ListenTaskConfigurationIntersection = ListenTaskConfiguration & Specification.ListenTaskConfiguration;
+
+/**
+ * Represents a constructor for the intersection of the ListenTaskConfiguration class and type
+ */
+export interface ListenTaskConfigurationConstructor {
+  new (model?: Partial): ListenTaskConfigurationIntersection;
+}
+
+/**
+ * Represents a ListenTaskConfiguration with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ListenTaskConfiguration extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the ListenTaskConfiguration class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ListenTaskConfiguration.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.ListenTaskConfiguration & object;
+    if (isObject(model)) {
+      if (typeof model.to === 'object') self.to = new _EventConsumptionStrategy(model.to);
+    }
+    getLifecycleHooks('ListenTaskConfiguration')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ListenTaskConfiguration.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ListenTaskConfiguration(this as any) as ListenTaskConfigurationIntersection;
+    validate('ListenTaskConfiguration', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ListenTaskConfiguration.
+   * Creates a copy of the ListenTaskConfiguration, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ListenTaskConfiguration instance.
+   */
+  normalize(): ListenTaskConfiguration & Specification.ListenTaskConfiguration {
+    const copy = new ListenTaskConfiguration(this as any) as ListenTaskConfigurationIntersection;
+    return getLifecycleHooks('ListenTaskConfiguration')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ListenTaskConfiguration = ListenTaskConfiguration as ListenTaskConfigurationConstructor;
diff --git a/src/lib/generated/classes/listen-task.ts b/src/lib/generated/classes/listen-task.ts
new file mode 100644
index 00000000..ae1fe547
--- /dev/null
+++ b/src/lib/generated/classes/listen-task.ts
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Input } from './input';
+import { _Output } from './output';
+import { _Export } from './export';
+import { _TaskTimeout } from './task-timeout';
+import { _TaskMetadata } from './task-metadata';
+import { _ListenTaskConfiguration } from './listen-task-configuration';
+import { _SubscriptionIterator } from './subscription-iterator';
+import { _TaskBase } from './task-base';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the ListenTask class and type
+ */
+export type ListenTaskIntersection = ListenTask & Specification.ListenTask;
+
+/**
+ * Represents a constructor for the intersection of the ListenTask class and type
+ */
+export interface ListenTaskConstructor {
+  new (model?: Partial): ListenTaskIntersection;
+}
+
+/**
+ * Represents a ListenTask with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ListenTask extends _TaskBase {
+  /**
+   * Instanciates a new instance of the ListenTask class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ListenTask.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.ListenTask & object;
+    if (isObject(model)) {
+      if (typeof model.input === 'object') self.input = new _Input(model.input);
+      if (typeof model.output === 'object') self.output = new _Output(model.output);
+      if (typeof model.export === 'object') self.export = new _Export(model.export);
+      if (typeof model.timeout === 'object') self.timeout = new _TaskTimeout(model.timeout);
+      if (typeof model.metadata === 'object') self.metadata = new _TaskMetadata(model.metadata);
+      if (typeof model.listen === 'object') self.listen = new _ListenTaskConfiguration(model.listen);
+      if (typeof model.foreach === 'object') self.foreach = new _SubscriptionIterator(model.foreach);
+    }
+    getLifecycleHooks('ListenTask')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ListenTask.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ListenTask(this as any) as ListenTaskIntersection;
+    validate('ListenTask', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ListenTask.
+   * Creates a copy of the ListenTask, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ListenTask instance.
+   */
+  normalize(): ListenTask & Specification.ListenTask {
+    const copy = new ListenTask(this as any) as ListenTaskIntersection;
+    return getLifecycleHooks('ListenTask')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ListenTask = ListenTask as ListenTaskConstructor;
diff --git a/src/lib/generated/classes/oauth2-autenthication-data-audiences.ts b/src/lib/generated/classes/oauth2-autenthication-data-audiences.ts
new file mode 100644
index 00000000..58c5cab5
--- /dev/null
+++ b/src/lib/generated/classes/oauth2-autenthication-data-audiences.ts
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { Specification } from '../definitions';
+import { ArrayHydrator } from '../../hydrator';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the OAuth2AutenthicationDataAudiences class and type
+ */
+export type OAuth2AutenthicationDataAudiencesIntersection = OAuth2AutenthicationDataAudiences &
+  Specification.OAuth2AutenthicationDataAudiences;
+
+/**
+ * Represents a constructor for the intersection of the OAuth2AutenthicationDataAudiences class and type
+ */
+export interface OAuth2AutenthicationDataAudiencesConstructor {
+  new (model?: Array | number): OAuth2AutenthicationDataAudiencesIntersection;
+}
+
+/**
+ * Represents a collection of string.
+ * Inherits from ArrayHydrator to handle array-specific hydration.
+ */
+export class OAuth2AutenthicationDataAudiences extends ArrayHydrator {
+  /**
+   * Constructs a new instance of the OAuth2AutenthicationDataAudiences class.
+   *
+   * @param model - Optional parameter which can be an array of objects or a number representing the array length.
+   */
+  constructor(model?: Array | number) {
+    super(model);
+    if (Array.isArray(model)) {
+      if (model?.length) {
+        this.splice(0, this.length);
+        model.forEach((item) => this.push(item));
+      }
+    }
+    Object.setPrototypeOf(this, Object.create(OAuth2AutenthicationDataAudiences.prototype));
+    getLifecycleHooks('OAuth2AutenthicationDataAudiences')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the OAuth2AutenthicationDataAudiences.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new OAuth2AutenthicationDataAudiences(this);
+    validate('OAuth2AutenthicationDataAudiences', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the OAuth2AutenthicationDataAudiences.
+   * Creates a copy of the OAuth2AutenthicationDataAudiences, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the OAuth2AutenthicationDataAudiences instance.
+   */
+  normalize(): OAuth2AutenthicationDataAudiences {
+    const copy = new OAuth2AutenthicationDataAudiences(this);
+    return getLifecycleHooks('OAuth2AutenthicationDataAudiences')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _OAuth2AutenthicationDataAudiences =
+  OAuth2AutenthicationDataAudiences as unknown as OAuth2AutenthicationDataAudiencesConstructor;
+//export const _OAuth2AutenthicationDataAudiences = OAuth2AutenthicationDataAudiences; // could be exported directly, but it makes the job of building the index more straightforward as it's consistant with "object" classes
diff --git a/src/lib/generated/classes/oauth2-autenthication-data-client.ts b/src/lib/generated/classes/oauth2-autenthication-data-client.ts
new file mode 100644
index 00000000..ae482383
--- /dev/null
+++ b/src/lib/generated/classes/oauth2-autenthication-data-client.ts
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the OAuth2AutenthicationDataClient class and type
+ */
+export type OAuth2AutenthicationDataClientIntersection = OAuth2AutenthicationDataClient &
+  Specification.OAuth2AutenthicationDataClient;
+
+/**
+ * Represents a constructor for the intersection of the OAuth2AutenthicationDataClient class and type
+ */
+export interface OAuth2AutenthicationDataClientConstructor {
+  new (model?: Partial): OAuth2AutenthicationDataClientIntersection;
+}
+
+/**
+ * Represents a OAuth2AutenthicationDataClient with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class OAuth2AutenthicationDataClient extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the OAuth2AutenthicationDataClient class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the OAuth2AutenthicationDataClient.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('OAuth2AutenthicationDataClient')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the OAuth2AutenthicationDataClient.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new OAuth2AutenthicationDataClient(this as any) as OAuth2AutenthicationDataClientIntersection;
+    validate('OAuth2AutenthicationDataClient', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the OAuth2AutenthicationDataClient.
+   * Creates a copy of the OAuth2AutenthicationDataClient, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the OAuth2AutenthicationDataClient instance.
+   */
+  normalize(): OAuth2AutenthicationDataClient & Specification.OAuth2AutenthicationDataClient {
+    const copy = new OAuth2AutenthicationDataClient(this as any) as OAuth2AutenthicationDataClientIntersection;
+    return getLifecycleHooks('OAuth2AutenthicationDataClient')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _OAuth2AutenthicationDataClient =
+  OAuth2AutenthicationDataClient as OAuth2AutenthicationDataClientConstructor;
diff --git a/src/lib/generated/classes/oauth2-autenthication-data-scopes.ts b/src/lib/generated/classes/oauth2-autenthication-data-scopes.ts
new file mode 100644
index 00000000..acc0c848
--- /dev/null
+++ b/src/lib/generated/classes/oauth2-autenthication-data-scopes.ts
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { Specification } from '../definitions';
+import { ArrayHydrator } from '../../hydrator';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the OAuth2AutenthicationDataScopes class and type
+ */
+export type OAuth2AutenthicationDataScopesIntersection = OAuth2AutenthicationDataScopes &
+  Specification.OAuth2AutenthicationDataScopes;
+
+/**
+ * Represents a constructor for the intersection of the OAuth2AutenthicationDataScopes class and type
+ */
+export interface OAuth2AutenthicationDataScopesConstructor {
+  new (model?: Array | number): OAuth2AutenthicationDataScopesIntersection;
+}
+
+/**
+ * Represents a collection of string.
+ * Inherits from ArrayHydrator to handle array-specific hydration.
+ */
+export class OAuth2AutenthicationDataScopes extends ArrayHydrator {
+  /**
+   * Constructs a new instance of the OAuth2AutenthicationDataScopes class.
+   *
+   * @param model - Optional parameter which can be an array of objects or a number representing the array length.
+   */
+  constructor(model?: Array | number) {
+    super(model);
+    if (Array.isArray(model)) {
+      if (model?.length) {
+        this.splice(0, this.length);
+        model.forEach((item) => this.push(item));
+      }
+    }
+    Object.setPrototypeOf(this, Object.create(OAuth2AutenthicationDataScopes.prototype));
+    getLifecycleHooks('OAuth2AutenthicationDataScopes')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the OAuth2AutenthicationDataScopes.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new OAuth2AutenthicationDataScopes(this);
+    validate('OAuth2AutenthicationDataScopes', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the OAuth2AutenthicationDataScopes.
+   * Creates a copy of the OAuth2AutenthicationDataScopes, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the OAuth2AutenthicationDataScopes instance.
+   */
+  normalize(): OAuth2AutenthicationDataScopes {
+    const copy = new OAuth2AutenthicationDataScopes(this);
+    return getLifecycleHooks('OAuth2AutenthicationDataScopes')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _OAuth2AutenthicationDataScopes =
+  OAuth2AutenthicationDataScopes as unknown as OAuth2AutenthicationDataScopesConstructor;
+//export const _OAuth2AutenthicationDataScopes = OAuth2AutenthicationDataScopes; // could be exported directly, but it makes the job of building the index more straightforward as it's consistant with "object" classes
diff --git a/src/lib/generated/classes/oauth2-autenthication-data.ts b/src/lib/generated/classes/oauth2-autenthication-data.ts
new file mode 100644
index 00000000..b36eb5be
--- /dev/null
+++ b/src/lib/generated/classes/oauth2-autenthication-data.ts
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _OAuth2AutenthicationDataClient } from './oauth2-autenthication-data-client';
+import { _OAuth2TokenRequest } from './oauth2-token-request';
+import { _OAuth2TokenDefinition } from './oauth2-token-definition';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the OAuth2AutenthicationData class and type
+ */
+export type OAuth2AutenthicationDataIntersection = OAuth2AutenthicationData & Specification.OAuth2AutenthicationData;
+
+/**
+ * Represents a constructor for the intersection of the OAuth2AutenthicationData class and type
+ */
+export interface OAuth2AutenthicationDataConstructor {
+  new (model?: Partial): OAuth2AutenthicationDataIntersection;
+}
+
+/**
+ * Represents a OAuth2AutenthicationData with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class OAuth2AutenthicationData extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the OAuth2AutenthicationData class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the OAuth2AutenthicationData.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.OAuth2AutenthicationData & object;
+    if (isObject(model)) {
+      if (typeof model.client === 'object') self.client = new _OAuth2AutenthicationDataClient(model.client);
+      if (typeof model.request === 'object') self.request = new _OAuth2TokenRequest(model.request);
+      if (typeof model.subject === 'object') self.subject = new _OAuth2TokenDefinition(model.subject);
+      if (typeof model.actor === 'object') self.actor = new _OAuth2TokenDefinition(model.actor);
+    }
+    getLifecycleHooks('OAuth2AutenthicationData')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the OAuth2AutenthicationData.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new OAuth2AutenthicationData(this as any) as OAuth2AutenthicationDataIntersection;
+    validate('OAuth2AutenthicationData', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the OAuth2AutenthicationData.
+   * Creates a copy of the OAuth2AutenthicationData, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the OAuth2AutenthicationData instance.
+   */
+  normalize(): OAuth2AutenthicationData & Specification.OAuth2AutenthicationData {
+    const copy = new OAuth2AutenthicationData(this as any) as OAuth2AutenthicationDataIntersection;
+    return getLifecycleHooks('OAuth2AutenthicationData')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _OAuth2AutenthicationData = OAuth2AutenthicationData as OAuth2AutenthicationDataConstructor;
diff --git a/src/lib/generated/classes/oauth2-authentication-policy-configuration.ts b/src/lib/generated/classes/oauth2-authentication-policy-configuration.ts
new file mode 100644
index 00000000..bb576e87
--- /dev/null
+++ b/src/lib/generated/classes/oauth2-authentication-policy-configuration.ts
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _OAuth2AutenthicationDataClient } from './oauth2-autenthication-data-client';
+import { _OAuth2TokenRequest } from './oauth2-token-request';
+import { _OAuth2TokenDefinition } from './oauth2-token-definition';
+import { _OAuth2AuthenticationPropertiesEndpoints } from './oauth2-authentication-properties-endpoints';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the OAuth2AuthenticationPolicyConfiguration class and type
+ */
+export type OAuth2AuthenticationPolicyConfigurationIntersection = OAuth2AuthenticationPolicyConfiguration &
+  Specification.OAuth2AuthenticationPolicyConfiguration;
+
+/**
+ * Represents a constructor for the intersection of the OAuth2AuthenticationPolicyConfiguration class and type
+ */
+export interface OAuth2AuthenticationPolicyConfigurationConstructor {
+  new (
+    model?: Partial,
+  ): OAuth2AuthenticationPolicyConfigurationIntersection;
+}
+
+/**
+ * Represents a OAuth2AuthenticationPolicyConfiguration with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class OAuth2AuthenticationPolicyConfiguration extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the OAuth2AuthenticationPolicyConfiguration class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the OAuth2AuthenticationPolicyConfiguration.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.OAuth2AuthenticationPolicyConfiguration & object;
+    if (isObject(model)) {
+      if (typeof (model as Specification.OAuth2AutenthicationData).client === 'object')
+        (self as Specification.OAuth2AutenthicationData).client = new _OAuth2AutenthicationDataClient(
+          (model as Specification.OAuth2AutenthicationData).client as Specification.OAuth2AutenthicationDataClient,
+        );
+      if (typeof (model as Specification.OAuth2AutenthicationData).request === 'object')
+        (self as Specification.OAuth2AutenthicationData).request = new _OAuth2TokenRequest(
+          (model as Specification.OAuth2AutenthicationData).request as Specification.OAuth2TokenRequest,
+        );
+      if (typeof (model as Specification.OAuth2AutenthicationData).subject === 'object')
+        (self as Specification.OAuth2AutenthicationData).subject = new _OAuth2TokenDefinition(
+          (model as Specification.OAuth2AutenthicationData).subject as Specification.OAuth2TokenDefinition,
+        );
+      if (typeof (model as Specification.OAuth2AutenthicationData).actor === 'object')
+        (self as Specification.OAuth2AutenthicationData).actor = new _OAuth2TokenDefinition(
+          (model as Specification.OAuth2AutenthicationData).actor as Specification.OAuth2TokenDefinition,
+        );
+      if (
+        typeof (model as { [k: string]: unknown; endpoints?: Specification.OAuth2AuthenticationPropertiesEndpoints })
+          .endpoints === 'object'
+      )
+        (
+          self as { [k: string]: unknown; endpoints?: Specification.OAuth2AuthenticationPropertiesEndpoints }
+        ).endpoints = new _OAuth2AuthenticationPropertiesEndpoints(
+          (model as { [k: string]: unknown; endpoints?: Specification.OAuth2AuthenticationPropertiesEndpoints })
+            .endpoints as Specification.OAuth2AuthenticationPropertiesEndpoints,
+        );
+    }
+    getLifecycleHooks('OAuth2AuthenticationPolicyConfiguration')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the OAuth2AuthenticationPolicyConfiguration.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new OAuth2AuthenticationPolicyConfiguration(
+      this as any,
+    ) as OAuth2AuthenticationPolicyConfigurationIntersection;
+    validate('OAuth2AuthenticationPolicyConfiguration', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the OAuth2AuthenticationPolicyConfiguration.
+   * Creates a copy of the OAuth2AuthenticationPolicyConfiguration, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the OAuth2AuthenticationPolicyConfiguration instance.
+   */
+  normalize(): OAuth2AuthenticationPolicyConfiguration & Specification.OAuth2AuthenticationPolicyConfiguration {
+    const copy = new OAuth2AuthenticationPolicyConfiguration(
+      this as any,
+    ) as OAuth2AuthenticationPolicyConfigurationIntersection;
+    return getLifecycleHooks('OAuth2AuthenticationPolicyConfiguration')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _OAuth2AuthenticationPolicyConfiguration =
+  OAuth2AuthenticationPolicyConfiguration as OAuth2AuthenticationPolicyConfigurationConstructor;
diff --git a/src/lib/generated/classes/oauth2-authentication-policy.ts b/src/lib/generated/classes/oauth2-authentication-policy.ts
new file mode 100644
index 00000000..92912895
--- /dev/null
+++ b/src/lib/generated/classes/oauth2-authentication-policy.ts
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _OAuth2AuthenticationPolicyConfiguration } from './oauth2-authentication-policy-configuration';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the OAuth2AuthenticationPolicy class and type
+ */
+export type OAuth2AuthenticationPolicyIntersection = OAuth2AuthenticationPolicy &
+  Specification.OAuth2AuthenticationPolicy;
+
+/**
+ * Represents a constructor for the intersection of the OAuth2AuthenticationPolicy class and type
+ */
+export interface OAuth2AuthenticationPolicyConstructor {
+  new (model?: Partial): OAuth2AuthenticationPolicyIntersection;
+}
+
+/**
+ * Represents a OAuth2AuthenticationPolicy with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class OAuth2AuthenticationPolicy extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the OAuth2AuthenticationPolicy class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the OAuth2AuthenticationPolicy.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.OAuth2AuthenticationPolicy & object;
+    if (isObject(model)) {
+      if (typeof model.oauth2 === 'object') self.oauth2 = new _OAuth2AuthenticationPolicyConfiguration(model.oauth2);
+    }
+    getLifecycleHooks('OAuth2AuthenticationPolicy')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the OAuth2AuthenticationPolicy.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new OAuth2AuthenticationPolicy(this as any) as OAuth2AuthenticationPolicyIntersection;
+    validate('OAuth2AuthenticationPolicy', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the OAuth2AuthenticationPolicy.
+   * Creates a copy of the OAuth2AuthenticationPolicy, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the OAuth2AuthenticationPolicy instance.
+   */
+  normalize(): OAuth2AuthenticationPolicy & Specification.OAuth2AuthenticationPolicy {
+    const copy = new OAuth2AuthenticationPolicy(this as any) as OAuth2AuthenticationPolicyIntersection;
+    return getLifecycleHooks('OAuth2AuthenticationPolicy')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _OAuth2AuthenticationPolicy = OAuth2AuthenticationPolicy as OAuth2AuthenticationPolicyConstructor;
diff --git a/src/lib/generated/classes/oauth2-authentication-properties-endpoints.ts b/src/lib/generated/classes/oauth2-authentication-properties-endpoints.ts
new file mode 100644
index 00000000..d4ebba4e
--- /dev/null
+++ b/src/lib/generated/classes/oauth2-authentication-properties-endpoints.ts
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the OAuth2AuthenticationPropertiesEndpoints class and type
+ */
+export type OAuth2AuthenticationPropertiesEndpointsIntersection = OAuth2AuthenticationPropertiesEndpoints &
+  Specification.OAuth2AuthenticationPropertiesEndpoints;
+
+/**
+ * Represents a constructor for the intersection of the OAuth2AuthenticationPropertiesEndpoints class and type
+ */
+export interface OAuth2AuthenticationPropertiesEndpointsConstructor {
+  new (
+    model?: Partial,
+  ): OAuth2AuthenticationPropertiesEndpointsIntersection;
+}
+
+/**
+ * Represents a OAuth2AuthenticationPropertiesEndpoints with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class OAuth2AuthenticationPropertiesEndpoints extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the OAuth2AuthenticationPropertiesEndpoints class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the OAuth2AuthenticationPropertiesEndpoints.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('OAuth2AuthenticationPropertiesEndpoints')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the OAuth2AuthenticationPropertiesEndpoints.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new OAuth2AuthenticationPropertiesEndpoints(
+      this as any,
+    ) as OAuth2AuthenticationPropertiesEndpointsIntersection;
+    validate('OAuth2AuthenticationPropertiesEndpoints', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the OAuth2AuthenticationPropertiesEndpoints.
+   * Creates a copy of the OAuth2AuthenticationPropertiesEndpoints, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the OAuth2AuthenticationPropertiesEndpoints instance.
+   */
+  normalize(): OAuth2AuthenticationPropertiesEndpoints & Specification.OAuth2AuthenticationPropertiesEndpoints {
+    const copy = new OAuth2AuthenticationPropertiesEndpoints(
+      this as any,
+    ) as OAuth2AuthenticationPropertiesEndpointsIntersection;
+    return getLifecycleHooks('OAuth2AuthenticationPropertiesEndpoints')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _OAuth2AuthenticationPropertiesEndpoints =
+  OAuth2AuthenticationPropertiesEndpoints as OAuth2AuthenticationPropertiesEndpointsConstructor;
diff --git a/src/lib/generated/classes/oauth2-connect-authentication-properties.ts b/src/lib/generated/classes/oauth2-connect-authentication-properties.ts
new file mode 100644
index 00000000..d7edf078
--- /dev/null
+++ b/src/lib/generated/classes/oauth2-connect-authentication-properties.ts
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _OAuth2AutenthicationDataClient } from './oauth2-autenthication-data-client';
+import { _OAuth2TokenRequest } from './oauth2-token-request';
+import { _OAuth2TokenDefinition } from './oauth2-token-definition';
+import { _OAuth2AuthenticationPropertiesEndpoints } from './oauth2-authentication-properties-endpoints';
+import { _OAuth2AutenthicationData } from './oauth2-autenthication-data';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the OAuth2ConnectAuthenticationProperties class and type
+ */
+export type OAuth2ConnectAuthenticationPropertiesIntersection = OAuth2ConnectAuthenticationProperties &
+  Specification.OAuth2ConnectAuthenticationProperties;
+
+/**
+ * Represents a constructor for the intersection of the OAuth2ConnectAuthenticationProperties class and type
+ */
+export interface OAuth2ConnectAuthenticationPropertiesConstructor {
+  new (
+    model?: Partial,
+  ): OAuth2ConnectAuthenticationPropertiesIntersection;
+}
+
+/**
+ * Represents a OAuth2ConnectAuthenticationProperties with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class OAuth2ConnectAuthenticationProperties extends _OAuth2AutenthicationData {
+  /**
+   * Instanciates a new instance of the OAuth2ConnectAuthenticationProperties class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the OAuth2ConnectAuthenticationProperties.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.OAuth2ConnectAuthenticationProperties & object;
+    if (isObject(model)) {
+      if (typeof model.client === 'object') self.client = new _OAuth2AutenthicationDataClient(model.client);
+      if (typeof model.request === 'object') self.request = new _OAuth2TokenRequest(model.request);
+      if (typeof model.subject === 'object') self.subject = new _OAuth2TokenDefinition(model.subject);
+      if (typeof model.actor === 'object') self.actor = new _OAuth2TokenDefinition(model.actor);
+      if (typeof model.endpoints === 'object')
+        self.endpoints = new _OAuth2AuthenticationPropertiesEndpoints(model.endpoints);
+    }
+    getLifecycleHooks('OAuth2ConnectAuthenticationProperties')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the OAuth2ConnectAuthenticationProperties.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new OAuth2ConnectAuthenticationProperties(
+      this as any,
+    ) as OAuth2ConnectAuthenticationPropertiesIntersection;
+    validate('OAuth2ConnectAuthenticationProperties', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the OAuth2ConnectAuthenticationProperties.
+   * Creates a copy of the OAuth2ConnectAuthenticationProperties, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the OAuth2ConnectAuthenticationProperties instance.
+   */
+  normalize(): OAuth2ConnectAuthenticationProperties & Specification.OAuth2ConnectAuthenticationProperties {
+    const copy = new OAuth2ConnectAuthenticationProperties(
+      this as any,
+    ) as OAuth2ConnectAuthenticationPropertiesIntersection;
+    return getLifecycleHooks('OAuth2ConnectAuthenticationProperties')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _OAuth2ConnectAuthenticationProperties =
+  OAuth2ConnectAuthenticationProperties as OAuth2ConnectAuthenticationPropertiesConstructor;
diff --git a/src/lib/generated/classes/oauth2-issuers.ts b/src/lib/generated/classes/oauth2-issuers.ts
new file mode 100644
index 00000000..a9607139
--- /dev/null
+++ b/src/lib/generated/classes/oauth2-issuers.ts
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { Specification } from '../definitions';
+import { ArrayHydrator } from '../../hydrator';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the OAuth2Issuers class and type
+ */
+export type OAuth2IssuersIntersection = OAuth2Issuers & Specification.OAuth2Issuers;
+
+/**
+ * Represents a constructor for the intersection of the OAuth2Issuers class and type
+ */
+export interface OAuth2IssuersConstructor {
+  new (model?: Array | number): OAuth2IssuersIntersection;
+}
+
+/**
+ * Represents a collection of string.
+ * Inherits from ArrayHydrator to handle array-specific hydration.
+ */
+export class OAuth2Issuers extends ArrayHydrator {
+  /**
+   * Constructs a new instance of the OAuth2Issuers class.
+   *
+   * @param model - Optional parameter which can be an array of objects or a number representing the array length.
+   */
+  constructor(model?: Array | number) {
+    super(model);
+    if (Array.isArray(model)) {
+      if (model?.length) {
+        this.splice(0, this.length);
+        model.forEach((item) => this.push(item));
+      }
+    }
+    Object.setPrototypeOf(this, Object.create(OAuth2Issuers.prototype));
+    getLifecycleHooks('OAuth2Issuers')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the OAuth2Issuers.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new OAuth2Issuers(this);
+    validate('OAuth2Issuers', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the OAuth2Issuers.
+   * Creates a copy of the OAuth2Issuers, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the OAuth2Issuers instance.
+   */
+  normalize(): OAuth2Issuers {
+    const copy = new OAuth2Issuers(this);
+    return getLifecycleHooks('OAuth2Issuers')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _OAuth2Issuers = OAuth2Issuers as unknown as OAuth2IssuersConstructor;
+//export const _OAuth2Issuers = OAuth2Issuers; // could be exported directly, but it makes the job of building the index more straightforward as it's consistant with "object" classes
diff --git a/src/lib/generated/classes/oauth2-token-definition.ts b/src/lib/generated/classes/oauth2-token-definition.ts
new file mode 100644
index 00000000..6c9b54de
--- /dev/null
+++ b/src/lib/generated/classes/oauth2-token-definition.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the OAuth2TokenDefinition class and type
+ */
+export type OAuth2TokenDefinitionIntersection = OAuth2TokenDefinition & Specification.OAuth2TokenDefinition;
+
+/**
+ * Represents a constructor for the intersection of the OAuth2TokenDefinition class and type
+ */
+export interface OAuth2TokenDefinitionConstructor {
+  new (model?: Partial): OAuth2TokenDefinitionIntersection;
+}
+
+/**
+ * Represents a OAuth2TokenDefinition with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class OAuth2TokenDefinition extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the OAuth2TokenDefinition class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the OAuth2TokenDefinition.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('OAuth2TokenDefinition')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the OAuth2TokenDefinition.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new OAuth2TokenDefinition(this as any) as OAuth2TokenDefinitionIntersection;
+    validate('OAuth2TokenDefinition', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the OAuth2TokenDefinition.
+   * Creates a copy of the OAuth2TokenDefinition, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the OAuth2TokenDefinition instance.
+   */
+  normalize(): OAuth2TokenDefinition & Specification.OAuth2TokenDefinition {
+    const copy = new OAuth2TokenDefinition(this as any) as OAuth2TokenDefinitionIntersection;
+    return getLifecycleHooks('OAuth2TokenDefinition')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _OAuth2TokenDefinition = OAuth2TokenDefinition as OAuth2TokenDefinitionConstructor;
diff --git a/src/lib/generated/classes/oauth2-token-request.ts b/src/lib/generated/classes/oauth2-token-request.ts
new file mode 100644
index 00000000..89781a24
--- /dev/null
+++ b/src/lib/generated/classes/oauth2-token-request.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the OAuth2TokenRequest class and type
+ */
+export type OAuth2TokenRequestIntersection = OAuth2TokenRequest & Specification.OAuth2TokenRequest;
+
+/**
+ * Represents a constructor for the intersection of the OAuth2TokenRequest class and type
+ */
+export interface OAuth2TokenRequestConstructor {
+  new (model?: Partial): OAuth2TokenRequestIntersection;
+}
+
+/**
+ * Represents a OAuth2TokenRequest with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class OAuth2TokenRequest extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the OAuth2TokenRequest class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the OAuth2TokenRequest.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('OAuth2TokenRequest')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the OAuth2TokenRequest.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new OAuth2TokenRequest(this as any) as OAuth2TokenRequestIntersection;
+    validate('OAuth2TokenRequest', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the OAuth2TokenRequest.
+   * Creates a copy of the OAuth2TokenRequest, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the OAuth2TokenRequest instance.
+   */
+  normalize(): OAuth2TokenRequest & Specification.OAuth2TokenRequest {
+    const copy = new OAuth2TokenRequest(this as any) as OAuth2TokenRequestIntersection;
+    return getLifecycleHooks('OAuth2TokenRequest')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _OAuth2TokenRequest = OAuth2TokenRequest as OAuth2TokenRequestConstructor;
diff --git a/src/lib/generated/classes/one-event-consumption-strategy.ts b/src/lib/generated/classes/one-event-consumption-strategy.ts
new file mode 100644
index 00000000..b494f482
--- /dev/null
+++ b/src/lib/generated/classes/one-event-consumption-strategy.ts
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _EventFilter } from './event-filter';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the OneEventConsumptionStrategy class and type
+ */
+export type OneEventConsumptionStrategyIntersection = OneEventConsumptionStrategy &
+  Specification.OneEventConsumptionStrategy;
+
+/**
+ * Represents a constructor for the intersection of the OneEventConsumptionStrategy class and type
+ */
+export interface OneEventConsumptionStrategyConstructor {
+  new (model?: Partial): OneEventConsumptionStrategyIntersection;
+}
+
+/**
+ * Represents a OneEventConsumptionStrategy with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class OneEventConsumptionStrategy extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the OneEventConsumptionStrategy class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the OneEventConsumptionStrategy.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.OneEventConsumptionStrategy & object;
+    if (isObject(model)) {
+      if (typeof model.one === 'object') self.one = new _EventFilter(model.one);
+    }
+    getLifecycleHooks('OneEventConsumptionStrategy')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the OneEventConsumptionStrategy.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new OneEventConsumptionStrategy(this as any) as OneEventConsumptionStrategyIntersection;
+    validate('OneEventConsumptionStrategy', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the OneEventConsumptionStrategy.
+   * Creates a copy of the OneEventConsumptionStrategy, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the OneEventConsumptionStrategy instance.
+   */
+  normalize(): OneEventConsumptionStrategy & Specification.OneEventConsumptionStrategy {
+    const copy = new OneEventConsumptionStrategy(this as any) as OneEventConsumptionStrategyIntersection;
+    return getLifecycleHooks('OneEventConsumptionStrategy')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _OneEventConsumptionStrategy = OneEventConsumptionStrategy as OneEventConsumptionStrategyConstructor;
diff --git a/src/lib/generated/classes/open-api-arguments.ts b/src/lib/generated/classes/open-api-arguments.ts
new file mode 100644
index 00000000..bfa0a688
--- /dev/null
+++ b/src/lib/generated/classes/open-api-arguments.ts
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _ExternalResource } from './external-resource';
+import { _WithOpenAPIParameters } from './with-open-api-parameters';
+import { _ReferenceableAuthenticationPolicy } from './referenceable-authentication-policy';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the OpenAPIArguments class and type
+ */
+export type OpenAPIArgumentsIntersection = OpenAPIArguments & Specification.OpenAPIArguments;
+
+/**
+ * Represents a constructor for the intersection of the OpenAPIArguments class and type
+ */
+export interface OpenAPIArgumentsConstructor {
+  new (model?: Partial): OpenAPIArgumentsIntersection;
+}
+
+/**
+ * Represents a OpenAPIArguments with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class OpenAPIArguments extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the OpenAPIArguments class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the OpenAPIArguments.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.OpenAPIArguments & object;
+    if (isObject(model)) {
+      if (typeof model.document === 'object') self.document = new _ExternalResource(model.document);
+      if (typeof model.parameters === 'object') self.parameters = new _WithOpenAPIParameters(model.parameters);
+      if (typeof model.authentication === 'object')
+        self.authentication = new _ReferenceableAuthenticationPolicy(model.authentication);
+    }
+    getLifecycleHooks('OpenAPIArguments')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the OpenAPIArguments.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new OpenAPIArguments(this as any) as OpenAPIArgumentsIntersection;
+    validate('OpenAPIArguments', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the OpenAPIArguments.
+   * Creates a copy of the OpenAPIArguments, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the OpenAPIArguments instance.
+   */
+  normalize(): OpenAPIArguments & Specification.OpenAPIArguments {
+    const copy = new OpenAPIArguments(this as any) as OpenAPIArgumentsIntersection;
+    return getLifecycleHooks('OpenAPIArguments')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _OpenAPIArguments = OpenAPIArguments as OpenAPIArgumentsConstructor;
diff --git a/src/lib/generated/classes/open-id-connect-authentication-policy-configuration.ts b/src/lib/generated/classes/open-id-connect-authentication-policy-configuration.ts
new file mode 100644
index 00000000..5026e98b
--- /dev/null
+++ b/src/lib/generated/classes/open-id-connect-authentication-policy-configuration.ts
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _OAuth2AutenthicationDataClient } from './oauth2-autenthication-data-client';
+import { _OAuth2TokenRequest } from './oauth2-token-request';
+import { _OAuth2TokenDefinition } from './oauth2-token-definition';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the OpenIdConnectAuthenticationPolicyConfiguration class and type
+ */
+export type OpenIdConnectAuthenticationPolicyConfigurationIntersection =
+  OpenIdConnectAuthenticationPolicyConfiguration & Specification.OpenIdConnectAuthenticationPolicyConfiguration;
+
+/**
+ * Represents a constructor for the intersection of the OpenIdConnectAuthenticationPolicyConfiguration class and type
+ */
+export interface OpenIdConnectAuthenticationPolicyConfigurationConstructor {
+  new (
+    model?: Partial,
+  ): OpenIdConnectAuthenticationPolicyConfigurationIntersection;
+}
+
+/**
+ * Represents a OpenIdConnectAuthenticationPolicyConfiguration with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class OpenIdConnectAuthenticationPolicyConfiguration extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the OpenIdConnectAuthenticationPolicyConfiguration class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the OpenIdConnectAuthenticationPolicyConfiguration.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.OpenIdConnectAuthenticationPolicyConfiguration & object;
+    if (isObject(model)) {
+      if (typeof (model as Specification.OpenIdConnectAuthenticationProperties).client === 'object')
+        (self as Specification.OpenIdConnectAuthenticationProperties).client = new _OAuth2AutenthicationDataClient(
+          (model as Specification.OpenIdConnectAuthenticationProperties)
+            .client as Specification.OAuth2AutenthicationDataClient,
+        );
+      if (typeof (model as Specification.OpenIdConnectAuthenticationProperties).request === 'object')
+        (self as Specification.OpenIdConnectAuthenticationProperties).request = new _OAuth2TokenRequest(
+          (model as Specification.OpenIdConnectAuthenticationProperties).request as Specification.OAuth2TokenRequest,
+        );
+      if (typeof (model as Specification.OpenIdConnectAuthenticationProperties).subject === 'object')
+        (self as Specification.OpenIdConnectAuthenticationProperties).subject = new _OAuth2TokenDefinition(
+          (model as Specification.OpenIdConnectAuthenticationProperties).subject as Specification.OAuth2TokenDefinition,
+        );
+      if (typeof (model as Specification.OpenIdConnectAuthenticationProperties).actor === 'object')
+        (self as Specification.OpenIdConnectAuthenticationProperties).actor = new _OAuth2TokenDefinition(
+          (model as Specification.OpenIdConnectAuthenticationProperties).actor as Specification.OAuth2TokenDefinition,
+        );
+    }
+    getLifecycleHooks('OpenIdConnectAuthenticationPolicyConfiguration')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the OpenIdConnectAuthenticationPolicyConfiguration.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new OpenIdConnectAuthenticationPolicyConfiguration(
+      this as any,
+    ) as OpenIdConnectAuthenticationPolicyConfigurationIntersection;
+    validate('OpenIdConnectAuthenticationPolicyConfiguration', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the OpenIdConnectAuthenticationPolicyConfiguration.
+   * Creates a copy of the OpenIdConnectAuthenticationPolicyConfiguration, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the OpenIdConnectAuthenticationPolicyConfiguration instance.
+   */
+  normalize(): OpenIdConnectAuthenticationPolicyConfiguration &
+    Specification.OpenIdConnectAuthenticationPolicyConfiguration {
+    const copy = new OpenIdConnectAuthenticationPolicyConfiguration(
+      this as any,
+    ) as OpenIdConnectAuthenticationPolicyConfigurationIntersection;
+    return getLifecycleHooks('OpenIdConnectAuthenticationPolicyConfiguration')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _OpenIdConnectAuthenticationPolicyConfiguration =
+  OpenIdConnectAuthenticationPolicyConfiguration as OpenIdConnectAuthenticationPolicyConfigurationConstructor;
diff --git a/src/lib/generated/classes/open-id-connect-authentication-policy.ts b/src/lib/generated/classes/open-id-connect-authentication-policy.ts
new file mode 100644
index 00000000..2e27b54e
--- /dev/null
+++ b/src/lib/generated/classes/open-id-connect-authentication-policy.ts
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _OpenIdConnectAuthenticationPolicyConfiguration } from './open-id-connect-authentication-policy-configuration';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the OpenIdConnectAuthenticationPolicy class and type
+ */
+export type OpenIdConnectAuthenticationPolicyIntersection = OpenIdConnectAuthenticationPolicy &
+  Specification.OpenIdConnectAuthenticationPolicy;
+
+/**
+ * Represents a constructor for the intersection of the OpenIdConnectAuthenticationPolicy class and type
+ */
+export interface OpenIdConnectAuthenticationPolicyConstructor {
+  new (model?: Partial): OpenIdConnectAuthenticationPolicyIntersection;
+}
+
+/**
+ * Represents a OpenIdConnectAuthenticationPolicy with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class OpenIdConnectAuthenticationPolicy extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the OpenIdConnectAuthenticationPolicy class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the OpenIdConnectAuthenticationPolicy.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.OpenIdConnectAuthenticationPolicy & object;
+    if (isObject(model)) {
+      if (typeof model.oidc === 'object') self.oidc = new _OpenIdConnectAuthenticationPolicyConfiguration(model.oidc);
+    }
+    getLifecycleHooks('OpenIdConnectAuthenticationPolicy')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the OpenIdConnectAuthenticationPolicy.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new OpenIdConnectAuthenticationPolicy(this as any) as OpenIdConnectAuthenticationPolicyIntersection;
+    validate('OpenIdConnectAuthenticationPolicy', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the OpenIdConnectAuthenticationPolicy.
+   * Creates a copy of the OpenIdConnectAuthenticationPolicy, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the OpenIdConnectAuthenticationPolicy instance.
+   */
+  normalize(): OpenIdConnectAuthenticationPolicy & Specification.OpenIdConnectAuthenticationPolicy {
+    const copy = new OpenIdConnectAuthenticationPolicy(this as any) as OpenIdConnectAuthenticationPolicyIntersection;
+    return getLifecycleHooks('OpenIdConnectAuthenticationPolicy')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _OpenIdConnectAuthenticationPolicy =
+  OpenIdConnectAuthenticationPolicy as OpenIdConnectAuthenticationPolicyConstructor;
diff --git a/src/lib/generated/classes/open-id-connect-authentication-properties.ts b/src/lib/generated/classes/open-id-connect-authentication-properties.ts
new file mode 100644
index 00000000..e571dd93
--- /dev/null
+++ b/src/lib/generated/classes/open-id-connect-authentication-properties.ts
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _OAuth2AutenthicationDataClient } from './oauth2-autenthication-data-client';
+import { _OAuth2TokenRequest } from './oauth2-token-request';
+import { _OAuth2TokenDefinition } from './oauth2-token-definition';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the OpenIdConnectAuthenticationProperties class and type
+ */
+export type OpenIdConnectAuthenticationPropertiesIntersection = OpenIdConnectAuthenticationProperties &
+  Specification.OpenIdConnectAuthenticationProperties;
+
+/**
+ * Represents a constructor for the intersection of the OpenIdConnectAuthenticationProperties class and type
+ */
+export interface OpenIdConnectAuthenticationPropertiesConstructor {
+  new (
+    model?: Partial,
+  ): OpenIdConnectAuthenticationPropertiesIntersection;
+}
+
+/**
+ * Represents a OpenIdConnectAuthenticationProperties with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class OpenIdConnectAuthenticationProperties extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the OpenIdConnectAuthenticationProperties class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the OpenIdConnectAuthenticationProperties.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.OpenIdConnectAuthenticationProperties & object;
+    if (isObject(model)) {
+      if (typeof model.client === 'object') self.client = new _OAuth2AutenthicationDataClient(model.client);
+      if (typeof model.request === 'object') self.request = new _OAuth2TokenRequest(model.request);
+      if (typeof model.subject === 'object') self.subject = new _OAuth2TokenDefinition(model.subject);
+      if (typeof model.actor === 'object') self.actor = new _OAuth2TokenDefinition(model.actor);
+    }
+    getLifecycleHooks('OpenIdConnectAuthenticationProperties')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the OpenIdConnectAuthenticationProperties.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new OpenIdConnectAuthenticationProperties(
+      this as any,
+    ) as OpenIdConnectAuthenticationPropertiesIntersection;
+    validate('OpenIdConnectAuthenticationProperties', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the OpenIdConnectAuthenticationProperties.
+   * Creates a copy of the OpenIdConnectAuthenticationProperties, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the OpenIdConnectAuthenticationProperties instance.
+   */
+  normalize(): OpenIdConnectAuthenticationProperties & Specification.OpenIdConnectAuthenticationProperties {
+    const copy = new OpenIdConnectAuthenticationProperties(
+      this as any,
+    ) as OpenIdConnectAuthenticationPropertiesIntersection;
+    return getLifecycleHooks('OpenIdConnectAuthenticationProperties')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _OpenIdConnectAuthenticationProperties =
+  OpenIdConnectAuthenticationProperties as OpenIdConnectAuthenticationPropertiesConstructor;
diff --git a/src/lib/generated/classes/output-as.ts b/src/lib/generated/classes/output-as.ts
new file mode 100644
index 00000000..dc5cbeca
--- /dev/null
+++ b/src/lib/generated/classes/output-as.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the OutputAs class and type
+ */
+export type OutputAsIntersection = OutputAs & Specification.OutputAs;
+
+/**
+ * Represents a constructor for the intersection of the OutputAs class and type
+ */
+export interface OutputAsConstructor {
+  new (model?: Partial): OutputAsIntersection;
+}
+
+/**
+ * Represents a OutputAs with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class OutputAs extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the OutputAs class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the OutputAs.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('OutputAs')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the OutputAs.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new OutputAs(this as any) as OutputAsIntersection;
+    validate('OutputAs', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the OutputAs.
+   * Creates a copy of the OutputAs, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the OutputAs instance.
+   */
+  normalize(): OutputAs & Specification.OutputAs {
+    const copy = new OutputAs(this as any) as OutputAsIntersection;
+    return getLifecycleHooks('OutputAs')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _OutputAs = OutputAs as OutputAsConstructor;
diff --git a/src/lib/generated/classes/output.ts b/src/lib/generated/classes/output.ts
new file mode 100644
index 00000000..a4ba1523
--- /dev/null
+++ b/src/lib/generated/classes/output.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Schema } from './schema';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the Output class and type
+ */
+export type OutputIntersection = Output & Specification.Output;
+
+/**
+ * Represents a constructor for the intersection of the Output class and type
+ */
+export interface OutputConstructor {
+  new (model?: Partial): OutputIntersection;
+}
+
+/**
+ * Represents a Output with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class Output extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the Output class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the Output.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.Output & object;
+    if (isObject(model)) {
+      if (typeof model.schema === 'object') self.schema = new _Schema(model.schema);
+    }
+    getLifecycleHooks('Output')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the Output.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new Output(this as any) as OutputIntersection;
+    validate('Output', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the Output.
+   * Creates a copy of the Output, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the Output instance.
+   */
+  normalize(): Output & Specification.Output {
+    const copy = new Output(this as any) as OutputIntersection;
+    return getLifecycleHooks('Output')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _Output = Output as OutputConstructor;
diff --git a/src/lib/generated/classes/raise-task-configuration.ts b/src/lib/generated/classes/raise-task-configuration.ts
new file mode 100644
index 00000000..505fabd2
--- /dev/null
+++ b/src/lib/generated/classes/raise-task-configuration.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _RaiseTaskError } from './raise-task-error';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the RaiseTaskConfiguration class and type
+ */
+export type RaiseTaskConfigurationIntersection = RaiseTaskConfiguration & Specification.RaiseTaskConfiguration;
+
+/**
+ * Represents a constructor for the intersection of the RaiseTaskConfiguration class and type
+ */
+export interface RaiseTaskConfigurationConstructor {
+  new (model?: Partial): RaiseTaskConfigurationIntersection;
+}
+
+/**
+ * Represents a RaiseTaskConfiguration with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class RaiseTaskConfiguration extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the RaiseTaskConfiguration class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the RaiseTaskConfiguration.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.RaiseTaskConfiguration & object;
+    if (isObject(model)) {
+      if (typeof model.error === 'object') self.error = new _RaiseTaskError(model.error);
+    }
+    getLifecycleHooks('RaiseTaskConfiguration')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the RaiseTaskConfiguration.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new RaiseTaskConfiguration(this as any) as RaiseTaskConfigurationIntersection;
+    validate('RaiseTaskConfiguration', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the RaiseTaskConfiguration.
+   * Creates a copy of the RaiseTaskConfiguration, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the RaiseTaskConfiguration instance.
+   */
+  normalize(): RaiseTaskConfiguration & Specification.RaiseTaskConfiguration {
+    const copy = new RaiseTaskConfiguration(this as any) as RaiseTaskConfigurationIntersection;
+    return getLifecycleHooks('RaiseTaskConfiguration')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _RaiseTaskConfiguration = RaiseTaskConfiguration as RaiseTaskConfigurationConstructor;
diff --git a/src/lib/generated/classes/raise-task-error.ts b/src/lib/generated/classes/raise-task-error.ts
new file mode 100644
index 00000000..cb7656a2
--- /dev/null
+++ b/src/lib/generated/classes/raise-task-error.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the RaiseTaskError class and type
+ */
+export type RaiseTaskErrorIntersection = RaiseTaskError & Specification.RaiseTaskError;
+
+/**
+ * Represents a constructor for the intersection of the RaiseTaskError class and type
+ */
+export interface RaiseTaskErrorConstructor {
+  new (model?: Partial): RaiseTaskErrorIntersection;
+}
+
+/**
+ * Represents a RaiseTaskError with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class RaiseTaskError extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the RaiseTaskError class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the RaiseTaskError.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('RaiseTaskError')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the RaiseTaskError.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new RaiseTaskError(this as any) as RaiseTaskErrorIntersection;
+    validate('RaiseTaskError', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the RaiseTaskError.
+   * Creates a copy of the RaiseTaskError, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the RaiseTaskError instance.
+   */
+  normalize(): RaiseTaskError & Specification.RaiseTaskError {
+    const copy = new RaiseTaskError(this as any) as RaiseTaskErrorIntersection;
+    return getLifecycleHooks('RaiseTaskError')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _RaiseTaskError = RaiseTaskError as RaiseTaskErrorConstructor;
diff --git a/src/lib/generated/classes/raise-task.ts b/src/lib/generated/classes/raise-task.ts
new file mode 100644
index 00000000..3dc84ae8
--- /dev/null
+++ b/src/lib/generated/classes/raise-task.ts
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Input } from './input';
+import { _Output } from './output';
+import { _Export } from './export';
+import { _TaskTimeout } from './task-timeout';
+import { _TaskMetadata } from './task-metadata';
+import { _RaiseTaskConfiguration } from './raise-task-configuration';
+import { _TaskBase } from './task-base';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the RaiseTask class and type
+ */
+export type RaiseTaskIntersection = RaiseTask & Specification.RaiseTask;
+
+/**
+ * Represents a constructor for the intersection of the RaiseTask class and type
+ */
+export interface RaiseTaskConstructor {
+  new (model?: Partial): RaiseTaskIntersection;
+}
+
+/**
+ * Represents a RaiseTask with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class RaiseTask extends _TaskBase {
+  /**
+   * Instanciates a new instance of the RaiseTask class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the RaiseTask.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.RaiseTask & object;
+    if (isObject(model)) {
+      if (typeof model.input === 'object') self.input = new _Input(model.input);
+      if (typeof model.output === 'object') self.output = new _Output(model.output);
+      if (typeof model.export === 'object') self.export = new _Export(model.export);
+      if (typeof model.timeout === 'object') self.timeout = new _TaskTimeout(model.timeout);
+      if (typeof model.metadata === 'object') self.metadata = new _TaskMetadata(model.metadata);
+      if (typeof model.raise === 'object') self.raise = new _RaiseTaskConfiguration(model.raise);
+    }
+    getLifecycleHooks('RaiseTask')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the RaiseTask.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new RaiseTask(this as any) as RaiseTaskIntersection;
+    validate('RaiseTask', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the RaiseTask.
+   * Creates a copy of the RaiseTask, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the RaiseTask instance.
+   */
+  normalize(): RaiseTask & Specification.RaiseTask {
+    const copy = new RaiseTask(this as any) as RaiseTaskIntersection;
+    return getLifecycleHooks('RaiseTask')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _RaiseTask = RaiseTask as RaiseTaskConstructor;
diff --git a/src/lib/generated/classes/referenceable-authentication-policy.ts b/src/lib/generated/classes/referenceable-authentication-policy.ts
new file mode 100644
index 00000000..badbb1be
--- /dev/null
+++ b/src/lib/generated/classes/referenceable-authentication-policy.ts
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _BasicAuthenticationPolicyConfiguration } from './basic-authentication-policy-configuration';
+import { _BearerAuthenticationPolicyConfiguration } from './bearer-authentication-policy-configuration';
+import { _DigestAuthenticationPolicyConfiguration } from './digest-authentication-policy-configuration';
+import { _OAuth2AuthenticationPolicyConfiguration } from './oauth2-authentication-policy-configuration';
+import { _OpenIdConnectAuthenticationPolicyConfiguration } from './open-id-connect-authentication-policy-configuration';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the ReferenceableAuthenticationPolicy class and type
+ */
+export type ReferenceableAuthenticationPolicyIntersection = ReferenceableAuthenticationPolicy &
+  Specification.ReferenceableAuthenticationPolicy;
+
+/**
+ * Represents a constructor for the intersection of the ReferenceableAuthenticationPolicy class and type
+ */
+export interface ReferenceableAuthenticationPolicyConstructor {
+  new (model?: Partial): ReferenceableAuthenticationPolicyIntersection;
+}
+
+/**
+ * Represents a ReferenceableAuthenticationPolicy with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ReferenceableAuthenticationPolicy extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the ReferenceableAuthenticationPolicy class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ReferenceableAuthenticationPolicy.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.ReferenceableAuthenticationPolicy & object;
+    if (isObject(model)) {
+      if (typeof (model as Specification.BasicAuthenticationPolicy).basic === 'object')
+        (self as Specification.BasicAuthenticationPolicy).basic = new _BasicAuthenticationPolicyConfiguration(
+          (model as Specification.BasicAuthenticationPolicy)
+            .basic as Specification.BasicAuthenticationPolicyConfiguration,
+        );
+      if (typeof (model as Specification.BearerAuthenticationPolicy).bearer === 'object')
+        (self as Specification.BearerAuthenticationPolicy).bearer = new _BearerAuthenticationPolicyConfiguration(
+          (model as Specification.BearerAuthenticationPolicy)
+            .bearer as Specification.BearerAuthenticationPolicyConfiguration,
+        );
+      if (typeof (model as Specification.DigestAuthenticationPolicy).digest === 'object')
+        (self as Specification.DigestAuthenticationPolicy).digest = new _DigestAuthenticationPolicyConfiguration(
+          (model as Specification.DigestAuthenticationPolicy)
+            .digest as Specification.DigestAuthenticationPolicyConfiguration,
+        );
+      if (typeof (model as Specification.OAuth2AuthenticationPolicy).oauth2 === 'object')
+        (self as Specification.OAuth2AuthenticationPolicy).oauth2 = new _OAuth2AuthenticationPolicyConfiguration(
+          (model as Specification.OAuth2AuthenticationPolicy)
+            .oauth2 as Specification.OAuth2AuthenticationPolicyConfiguration,
+        );
+      if (typeof (model as Specification.OpenIdConnectAuthenticationPolicy).oidc === 'object')
+        (self as Specification.OpenIdConnectAuthenticationPolicy).oidc =
+          new _OpenIdConnectAuthenticationPolicyConfiguration(
+            (model as Specification.OpenIdConnectAuthenticationPolicy)
+              .oidc as Specification.OpenIdConnectAuthenticationPolicyConfiguration,
+          );
+    }
+    getLifecycleHooks('ReferenceableAuthenticationPolicy')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ReferenceableAuthenticationPolicy.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ReferenceableAuthenticationPolicy(this as any) as ReferenceableAuthenticationPolicyIntersection;
+    validate('ReferenceableAuthenticationPolicy', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ReferenceableAuthenticationPolicy.
+   * Creates a copy of the ReferenceableAuthenticationPolicy, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ReferenceableAuthenticationPolicy instance.
+   */
+  normalize(): ReferenceableAuthenticationPolicy & Specification.ReferenceableAuthenticationPolicy {
+    const copy = new ReferenceableAuthenticationPolicy(this as any) as ReferenceableAuthenticationPolicyIntersection;
+    return getLifecycleHooks('ReferenceableAuthenticationPolicy')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ReferenceableAuthenticationPolicy =
+  ReferenceableAuthenticationPolicy as ReferenceableAuthenticationPolicyConstructor;
diff --git a/src/lib/generated/classes/retry-backoff.ts b/src/lib/generated/classes/retry-backoff.ts
new file mode 100644
index 00000000..bed48e77
--- /dev/null
+++ b/src/lib/generated/classes/retry-backoff.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the RetryBackoff class and type
+ */
+export type RetryBackoffIntersection = RetryBackoff & Specification.RetryBackoff;
+
+/**
+ * Represents a constructor for the intersection of the RetryBackoff class and type
+ */
+export interface RetryBackoffConstructor {
+  new (model?: Partial): RetryBackoffIntersection;
+}
+
+/**
+ * Represents a RetryBackoff with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class RetryBackoff extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the RetryBackoff class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the RetryBackoff.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('RetryBackoff')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the RetryBackoff.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new RetryBackoff(this as any) as RetryBackoffIntersection;
+    validate('RetryBackoff', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the RetryBackoff.
+   * Creates a copy of the RetryBackoff, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the RetryBackoff instance.
+   */
+  normalize(): RetryBackoff & Specification.RetryBackoff {
+    const copy = new RetryBackoff(this as any) as RetryBackoffIntersection;
+    return getLifecycleHooks('RetryBackoff')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _RetryBackoff = RetryBackoff as RetryBackoffConstructor;
diff --git a/src/lib/generated/classes/retry-limit-attempt.ts b/src/lib/generated/classes/retry-limit-attempt.ts
new file mode 100644
index 00000000..e48b9e77
--- /dev/null
+++ b/src/lib/generated/classes/retry-limit-attempt.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Duration } from './duration';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the RetryLimitAttempt class and type
+ */
+export type RetryLimitAttemptIntersection = RetryLimitAttempt & Specification.RetryLimitAttempt;
+
+/**
+ * Represents a constructor for the intersection of the RetryLimitAttempt class and type
+ */
+export interface RetryLimitAttemptConstructor {
+  new (model?: Partial): RetryLimitAttemptIntersection;
+}
+
+/**
+ * Represents a RetryLimitAttempt with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class RetryLimitAttempt extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the RetryLimitAttempt class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the RetryLimitAttempt.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.RetryLimitAttempt & object;
+    if (isObject(model)) {
+      if (typeof model.duration === 'object') self.duration = new _Duration(model.duration);
+    }
+    getLifecycleHooks('RetryLimitAttempt')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the RetryLimitAttempt.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new RetryLimitAttempt(this as any) as RetryLimitAttemptIntersection;
+    validate('RetryLimitAttempt', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the RetryLimitAttempt.
+   * Creates a copy of the RetryLimitAttempt, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the RetryLimitAttempt instance.
+   */
+  normalize(): RetryLimitAttempt & Specification.RetryLimitAttempt {
+    const copy = new RetryLimitAttempt(this as any) as RetryLimitAttemptIntersection;
+    return getLifecycleHooks('RetryLimitAttempt')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _RetryLimitAttempt = RetryLimitAttempt as RetryLimitAttemptConstructor;
diff --git a/src/lib/generated/classes/retry-limit.ts b/src/lib/generated/classes/retry-limit.ts
new file mode 100644
index 00000000..d745e861
--- /dev/null
+++ b/src/lib/generated/classes/retry-limit.ts
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _RetryLimitAttempt } from './retry-limit-attempt';
+import { _Duration } from './duration';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the RetryLimit class and type
+ */
+export type RetryLimitIntersection = RetryLimit & Specification.RetryLimit;
+
+/**
+ * Represents a constructor for the intersection of the RetryLimit class and type
+ */
+export interface RetryLimitConstructor {
+  new (model?: Partial): RetryLimitIntersection;
+}
+
+/**
+ * Represents a RetryLimit with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class RetryLimit extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the RetryLimit class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the RetryLimit.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.RetryLimit & object;
+    if (isObject(model)) {
+      if (typeof model.attempt === 'object') self.attempt = new _RetryLimitAttempt(model.attempt);
+      if (typeof model.duration === 'object') self.duration = new _Duration(model.duration);
+    }
+    getLifecycleHooks('RetryLimit')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the RetryLimit.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new RetryLimit(this as any) as RetryLimitIntersection;
+    validate('RetryLimit', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the RetryLimit.
+   * Creates a copy of the RetryLimit, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the RetryLimit instance.
+   */
+  normalize(): RetryLimit & Specification.RetryLimit {
+    const copy = new RetryLimit(this as any) as RetryLimitIntersection;
+    return getLifecycleHooks('RetryLimit')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _RetryLimit = RetryLimit as RetryLimitConstructor;
diff --git a/src/lib/generated/classes/retry-policy-jitter.ts b/src/lib/generated/classes/retry-policy-jitter.ts
new file mode 100644
index 00000000..c8059791
--- /dev/null
+++ b/src/lib/generated/classes/retry-policy-jitter.ts
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Duration } from './duration';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the RetryPolicyJitter class and type
+ */
+export type RetryPolicyJitterIntersection = RetryPolicyJitter & Specification.RetryPolicyJitter;
+
+/**
+ * Represents a constructor for the intersection of the RetryPolicyJitter class and type
+ */
+export interface RetryPolicyJitterConstructor {
+  new (model?: Partial): RetryPolicyJitterIntersection;
+}
+
+/**
+ * Represents a RetryPolicyJitter with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class RetryPolicyJitter extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the RetryPolicyJitter class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the RetryPolicyJitter.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.RetryPolicyJitter & object;
+    if (isObject(model)) {
+      if (typeof model.from === 'object') self.from = new _Duration(model.from);
+      if (typeof model.to === 'object') self.to = new _Duration(model.to);
+    }
+    getLifecycleHooks('RetryPolicyJitter')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the RetryPolicyJitter.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new RetryPolicyJitter(this as any) as RetryPolicyJitterIntersection;
+    validate('RetryPolicyJitter', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the RetryPolicyJitter.
+   * Creates a copy of the RetryPolicyJitter, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the RetryPolicyJitter instance.
+   */
+  normalize(): RetryPolicyJitter & Specification.RetryPolicyJitter {
+    const copy = new RetryPolicyJitter(this as any) as RetryPolicyJitterIntersection;
+    return getLifecycleHooks('RetryPolicyJitter')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _RetryPolicyJitter = RetryPolicyJitter as RetryPolicyJitterConstructor;
diff --git a/src/lib/generated/classes/retry-policy.ts b/src/lib/generated/classes/retry-policy.ts
new file mode 100644
index 00000000..2678380f
--- /dev/null
+++ b/src/lib/generated/classes/retry-policy.ts
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Duration } from './duration';
+import { _RetryBackoff } from './retry-backoff';
+import { _RetryLimit } from './retry-limit';
+import { _RetryPolicyJitter } from './retry-policy-jitter';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the RetryPolicy class and type
+ */
+export type RetryPolicyIntersection = RetryPolicy & Specification.RetryPolicy;
+
+/**
+ * Represents a constructor for the intersection of the RetryPolicy class and type
+ */
+export interface RetryPolicyConstructor {
+  new (model?: Partial): RetryPolicyIntersection;
+}
+
+/**
+ * Represents a RetryPolicy with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class RetryPolicy extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the RetryPolicy class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the RetryPolicy.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.RetryPolicy & object;
+    if (isObject(model)) {
+      if (typeof model.delay === 'object') self.delay = new _Duration(model.delay);
+      if (typeof model.backoff === 'object') self.backoff = new _RetryBackoff(model.backoff);
+      if (typeof model.limit === 'object') self.limit = new _RetryLimit(model.limit);
+      if (typeof model.jitter === 'object') self.jitter = new _RetryPolicyJitter(model.jitter);
+    }
+    getLifecycleHooks('RetryPolicy')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the RetryPolicy.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new RetryPolicy(this as any) as RetryPolicyIntersection;
+    validate('RetryPolicy', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the RetryPolicy.
+   * Creates a copy of the RetryPolicy, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the RetryPolicy instance.
+   */
+  normalize(): RetryPolicy & Specification.RetryPolicy {
+    const copy = new RetryPolicy(this as any) as RetryPolicyIntersection;
+    return getLifecycleHooks('RetryPolicy')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _RetryPolicy = RetryPolicy as RetryPolicyConstructor;
diff --git a/src/lib/generated/classes/run-container.ts b/src/lib/generated/classes/run-container.ts
new file mode 100644
index 00000000..2bb9dc04
--- /dev/null
+++ b/src/lib/generated/classes/run-container.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Container } from './container';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the RunContainer class and type
+ */
+export type RunContainerIntersection = RunContainer & Specification.RunContainer;
+
+/**
+ * Represents a constructor for the intersection of the RunContainer class and type
+ */
+export interface RunContainerConstructor {
+  new (model?: Partial): RunContainerIntersection;
+}
+
+/**
+ * Represents a RunContainer with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class RunContainer extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the RunContainer class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the RunContainer.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.RunContainer & object;
+    if (isObject(model)) {
+      if (typeof model.container === 'object') self.container = new _Container(model.container);
+    }
+    getLifecycleHooks('RunContainer')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the RunContainer.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new RunContainer(this as any) as RunContainerIntersection;
+    validate('RunContainer', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the RunContainer.
+   * Creates a copy of the RunContainer, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the RunContainer instance.
+   */
+  normalize(): RunContainer & Specification.RunContainer {
+    const copy = new RunContainer(this as any) as RunContainerIntersection;
+    return getLifecycleHooks('RunContainer')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _RunContainer = RunContainer as RunContainerConstructor;
diff --git a/src/lib/generated/classes/run-script.ts b/src/lib/generated/classes/run-script.ts
new file mode 100644
index 00000000..0e5c829b
--- /dev/null
+++ b/src/lib/generated/classes/run-script.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Script } from './script';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the RunScript class and type
+ */
+export type RunScriptIntersection = RunScript & Specification.RunScript;
+
+/**
+ * Represents a constructor for the intersection of the RunScript class and type
+ */
+export interface RunScriptConstructor {
+  new (model?: Partial): RunScriptIntersection;
+}
+
+/**
+ * Represents a RunScript with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class RunScript extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the RunScript class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the RunScript.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.RunScript & object;
+    if (isObject(model)) {
+      if (typeof model.script === 'object') self.script = new _Script(model.script);
+    }
+    getLifecycleHooks('RunScript')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the RunScript.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new RunScript(this as any) as RunScriptIntersection;
+    validate('RunScript', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the RunScript.
+   * Creates a copy of the RunScript, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the RunScript instance.
+   */
+  normalize(): RunScript & Specification.RunScript {
+    const copy = new RunScript(this as any) as RunScriptIntersection;
+    return getLifecycleHooks('RunScript')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _RunScript = RunScript as RunScriptConstructor;
diff --git a/src/lib/generated/classes/run-shell.ts b/src/lib/generated/classes/run-shell.ts
new file mode 100644
index 00000000..8d641e4c
--- /dev/null
+++ b/src/lib/generated/classes/run-shell.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Shell } from './shell';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the RunShell class and type
+ */
+export type RunShellIntersection = RunShell & Specification.RunShell;
+
+/**
+ * Represents a constructor for the intersection of the RunShell class and type
+ */
+export interface RunShellConstructor {
+  new (model?: Partial): RunShellIntersection;
+}
+
+/**
+ * Represents a RunShell with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class RunShell extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the RunShell class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the RunShell.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.RunShell & object;
+    if (isObject(model)) {
+      if (typeof model.shell === 'object') self.shell = new _Shell(model.shell);
+    }
+    getLifecycleHooks('RunShell')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the RunShell.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new RunShell(this as any) as RunShellIntersection;
+    validate('RunShell', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the RunShell.
+   * Creates a copy of the RunShell, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the RunShell instance.
+   */
+  normalize(): RunShell & Specification.RunShell {
+    const copy = new RunShell(this as any) as RunShellIntersection;
+    return getLifecycleHooks('RunShell')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _RunShell = RunShell as RunShellConstructor;
diff --git a/src/lib/generated/classes/run-task-configuration.ts b/src/lib/generated/classes/run-task-configuration.ts
new file mode 100644
index 00000000..7a475836
--- /dev/null
+++ b/src/lib/generated/classes/run-task-configuration.ts
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Container } from './container';
+import { _Script } from './script';
+import { _Shell } from './shell';
+import { _SubflowConfiguration } from './subflow-configuration';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the RunTaskConfiguration class and type
+ */
+export type RunTaskConfigurationIntersection = RunTaskConfiguration & Specification.RunTaskConfiguration;
+
+/**
+ * Represents a constructor for the intersection of the RunTaskConfiguration class and type
+ */
+export interface RunTaskConfigurationConstructor {
+  new (model?: Partial): RunTaskConfigurationIntersection;
+}
+
+/**
+ * Represents a RunTaskConfiguration with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class RunTaskConfiguration extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the RunTaskConfiguration class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the RunTaskConfiguration.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.RunTaskConfiguration & object;
+    if (isObject(model)) {
+      if (typeof (model as Specification.RunContainer).container === 'object')
+        (self as Specification.RunContainer).container = new _Container(
+          (model as Specification.RunContainer).container as Specification.Container,
+        );
+      if (typeof (model as Specification.RunScript).script === 'object')
+        (self as Specification.RunScript).script = new _Script(
+          (model as Specification.RunScript).script as Specification.Script,
+        );
+      if (typeof (model as Specification.RunShell).shell === 'object')
+        (self as Specification.RunShell).shell = new _Shell(
+          (model as Specification.RunShell).shell as Specification.Shell,
+        );
+      if (typeof (model as Specification.RunWorkflow).workflow === 'object')
+        (self as Specification.RunWorkflow).workflow = new _SubflowConfiguration(
+          (model as Specification.RunWorkflow).workflow as Specification.SubflowConfiguration,
+        );
+    }
+    getLifecycleHooks('RunTaskConfiguration')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the RunTaskConfiguration.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new RunTaskConfiguration(this as any) as RunTaskConfigurationIntersection;
+    validate('RunTaskConfiguration', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the RunTaskConfiguration.
+   * Creates a copy of the RunTaskConfiguration, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the RunTaskConfiguration instance.
+   */
+  normalize(): RunTaskConfiguration & Specification.RunTaskConfiguration {
+    const copy = new RunTaskConfiguration(this as any) as RunTaskConfigurationIntersection;
+    return getLifecycleHooks('RunTaskConfiguration')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _RunTaskConfiguration = RunTaskConfiguration as RunTaskConfigurationConstructor;
diff --git a/src/lib/generated/classes/run-task.ts b/src/lib/generated/classes/run-task.ts
new file mode 100644
index 00000000..271d4f50
--- /dev/null
+++ b/src/lib/generated/classes/run-task.ts
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Input } from './input';
+import { _Output } from './output';
+import { _Export } from './export';
+import { _TaskTimeout } from './task-timeout';
+import { _TaskMetadata } from './task-metadata';
+import { _RunTaskConfiguration } from './run-task-configuration';
+import { _TaskBase } from './task-base';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the RunTask class and type
+ */
+export type RunTaskIntersection = RunTask & Specification.RunTask;
+
+/**
+ * Represents a constructor for the intersection of the RunTask class and type
+ */
+export interface RunTaskConstructor {
+  new (model?: Partial): RunTaskIntersection;
+}
+
+/**
+ * Represents a RunTask with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class RunTask extends _TaskBase {
+  /**
+   * Instanciates a new instance of the RunTask class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the RunTask.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.RunTask & object;
+    if (isObject(model)) {
+      if (typeof model.input === 'object') self.input = new _Input(model.input);
+      if (typeof model.output === 'object') self.output = new _Output(model.output);
+      if (typeof model.export === 'object') self.export = new _Export(model.export);
+      if (typeof model.timeout === 'object') self.timeout = new _TaskTimeout(model.timeout);
+      if (typeof model.metadata === 'object') self.metadata = new _TaskMetadata(model.metadata);
+      if (typeof model.run === 'object') self.run = new _RunTaskConfiguration(model.run);
+    }
+    getLifecycleHooks('RunTask')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the RunTask.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new RunTask(this as any) as RunTaskIntersection;
+    validate('RunTask', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the RunTask.
+   * Creates a copy of the RunTask, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the RunTask instance.
+   */
+  normalize(): RunTask & Specification.RunTask {
+    const copy = new RunTask(this as any) as RunTaskIntersection;
+    return getLifecycleHooks('RunTask')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _RunTask = RunTask as RunTaskConstructor;
diff --git a/src/lib/generated/classes/run-workflow.ts b/src/lib/generated/classes/run-workflow.ts
new file mode 100644
index 00000000..60940869
--- /dev/null
+++ b/src/lib/generated/classes/run-workflow.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _SubflowConfiguration } from './subflow-configuration';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the RunWorkflow class and type
+ */
+export type RunWorkflowIntersection = RunWorkflow & Specification.RunWorkflow;
+
+/**
+ * Represents a constructor for the intersection of the RunWorkflow class and type
+ */
+export interface RunWorkflowConstructor {
+  new (model?: Partial): RunWorkflowIntersection;
+}
+
+/**
+ * Represents a RunWorkflow with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class RunWorkflow extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the RunWorkflow class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the RunWorkflow.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.RunWorkflow & object;
+    if (isObject(model)) {
+      if (typeof model.workflow === 'object') self.workflow = new _SubflowConfiguration(model.workflow);
+    }
+    getLifecycleHooks('RunWorkflow')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the RunWorkflow.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new RunWorkflow(this as any) as RunWorkflowIntersection;
+    validate('RunWorkflow', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the RunWorkflow.
+   * Creates a copy of the RunWorkflow, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the RunWorkflow instance.
+   */
+  normalize(): RunWorkflow & Specification.RunWorkflow {
+    const copy = new RunWorkflow(this as any) as RunWorkflowIntersection;
+    return getLifecycleHooks('RunWorkflow')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _RunWorkflow = RunWorkflow as RunWorkflowConstructor;
diff --git a/src/lib/generated/classes/runtime-expression.ts b/src/lib/generated/classes/runtime-expression.ts
new file mode 100644
index 00000000..ec80d13b
--- /dev/null
+++ b/src/lib/generated/classes/runtime-expression.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the RuntimeExpression class and type
+ */
+export type RuntimeExpressionIntersection = RuntimeExpression & Specification.RuntimeExpression;
+
+/**
+ * Represents a constructor for the intersection of the RuntimeExpression class and type
+ */
+export interface RuntimeExpressionConstructor {
+  new (model?: Partial): RuntimeExpressionIntersection;
+}
+
+/**
+ * Represents a RuntimeExpression with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class RuntimeExpression extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the RuntimeExpression class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the RuntimeExpression.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('RuntimeExpression')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the RuntimeExpression.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new RuntimeExpression(this as any) as RuntimeExpressionIntersection;
+    validate('RuntimeExpression', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the RuntimeExpression.
+   * Creates a copy of the RuntimeExpression, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the RuntimeExpression instance.
+   */
+  normalize(): RuntimeExpression & Specification.RuntimeExpression {
+    const copy = new RuntimeExpression(this as any) as RuntimeExpressionIntersection;
+    return getLifecycleHooks('RuntimeExpression')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _RuntimeExpression = RuntimeExpression as RuntimeExpressionConstructor;
diff --git a/src/lib/generated/classes/schedule.ts b/src/lib/generated/classes/schedule.ts
new file mode 100644
index 00000000..60c90883
--- /dev/null
+++ b/src/lib/generated/classes/schedule.ts
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Duration } from './duration';
+import { _EventConsumptionStrategy } from './event-consumption-strategy';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the Schedule class and type
+ */
+export type ScheduleIntersection = Schedule & Specification.Schedule;
+
+/**
+ * Represents a constructor for the intersection of the Schedule class and type
+ */
+export interface ScheduleConstructor {
+  new (model?: Partial): ScheduleIntersection;
+}
+
+/**
+ * Represents a Schedule with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class Schedule extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the Schedule class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the Schedule.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.Schedule & object;
+    if (isObject(model)) {
+      if (typeof model.every === 'object') self.every = new _Duration(model.every);
+      if (typeof model.after === 'object') self.after = new _Duration(model.after);
+      if (typeof model.on === 'object') self.on = new _EventConsumptionStrategy(model.on);
+    }
+    getLifecycleHooks('Schedule')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the Schedule.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new Schedule(this as any) as ScheduleIntersection;
+    validate('Schedule', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the Schedule.
+   * Creates a copy of the Schedule, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the Schedule instance.
+   */
+  normalize(): Schedule & Specification.Schedule {
+    const copy = new Schedule(this as any) as ScheduleIntersection;
+    return getLifecycleHooks('Schedule')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _Schedule = Schedule as ScheduleConstructor;
diff --git a/src/lib/generated/classes/schema-external.ts b/src/lib/generated/classes/schema-external.ts
new file mode 100644
index 00000000..2c33cc5a
--- /dev/null
+++ b/src/lib/generated/classes/schema-external.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _ExternalResource } from './external-resource';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the SchemaExternal class and type
+ */
+export type SchemaExternalIntersection = SchemaExternal & Specification.SchemaExternal;
+
+/**
+ * Represents a constructor for the intersection of the SchemaExternal class and type
+ */
+export interface SchemaExternalConstructor {
+  new (model?: Partial): SchemaExternalIntersection;
+}
+
+/**
+ * Represents a SchemaExternal with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class SchemaExternal extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the SchemaExternal class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the SchemaExternal.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.SchemaExternal & object;
+    if (isObject(model)) {
+      if (typeof model.resource === 'object') self.resource = new _ExternalResource(model.resource);
+    }
+    getLifecycleHooks('SchemaExternal')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the SchemaExternal.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new SchemaExternal(this as any) as SchemaExternalIntersection;
+    validate('SchemaExternal', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the SchemaExternal.
+   * Creates a copy of the SchemaExternal, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the SchemaExternal instance.
+   */
+  normalize(): SchemaExternal & Specification.SchemaExternal {
+    const copy = new SchemaExternal(this as any) as SchemaExternalIntersection;
+    return getLifecycleHooks('SchemaExternal')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _SchemaExternal = SchemaExternal as SchemaExternalConstructor;
diff --git a/src/lib/generated/classes/schema-inline.ts b/src/lib/generated/classes/schema-inline.ts
new file mode 100644
index 00000000..4a66913d
--- /dev/null
+++ b/src/lib/generated/classes/schema-inline.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the SchemaInline class and type
+ */
+export type SchemaInlineIntersection = SchemaInline & Specification.SchemaInline;
+
+/**
+ * Represents a constructor for the intersection of the SchemaInline class and type
+ */
+export interface SchemaInlineConstructor {
+  new (model?: Partial): SchemaInlineIntersection;
+}
+
+/**
+ * Represents a SchemaInline with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class SchemaInline extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the SchemaInline class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the SchemaInline.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('SchemaInline')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the SchemaInline.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new SchemaInline(this as any) as SchemaInlineIntersection;
+    validate('SchemaInline', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the SchemaInline.
+   * Creates a copy of the SchemaInline, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the SchemaInline instance.
+   */
+  normalize(): SchemaInline & Specification.SchemaInline {
+    const copy = new SchemaInline(this as any) as SchemaInlineIntersection;
+    return getLifecycleHooks('SchemaInline')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _SchemaInline = SchemaInline as SchemaInlineConstructor;
diff --git a/src/lib/generated/classes/schema.ts b/src/lib/generated/classes/schema.ts
new file mode 100644
index 00000000..038d5af4
--- /dev/null
+++ b/src/lib/generated/classes/schema.ts
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _ExternalResource } from './external-resource';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the Schema class and type
+ */
+export type SchemaIntersection = Schema & Specification.Schema;
+
+/**
+ * Represents a constructor for the intersection of the Schema class and type
+ */
+export interface SchemaConstructor {
+  new (model?: Partial): SchemaIntersection;
+}
+
+/**
+ * Represents a Schema with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class Schema extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the Schema class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the Schema.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.Schema & object;
+    if (isObject(model)) {
+      if (typeof (model as Specification.SchemaExternal).resource === 'object')
+        (self as Specification.SchemaExternal).resource = new _ExternalResource(
+          (model as Specification.SchemaExternal).resource as Specification.ExternalResource,
+        );
+    }
+    getLifecycleHooks('Schema')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the Schema.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new Schema(this as any) as SchemaIntersection;
+    validate('Schema', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the Schema.
+   * Creates a copy of the Schema, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the Schema instance.
+   */
+  normalize(): Schema & Specification.Schema {
+    const copy = new Schema(this as any) as SchemaIntersection;
+    return getLifecycleHooks('Schema')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _Schema = Schema as SchemaConstructor;
diff --git a/src/lib/generated/classes/script.ts b/src/lib/generated/classes/script.ts
new file mode 100644
index 00000000..40d83f62
--- /dev/null
+++ b/src/lib/generated/classes/script.ts
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _ExternalResource } from './external-resource';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the Script class and type
+ */
+export type ScriptIntersection = Script & Specification.Script;
+
+/**
+ * Represents a constructor for the intersection of the Script class and type
+ */
+export interface ScriptConstructor {
+  new (model?: Partial): ScriptIntersection;
+}
+
+/**
+ * Represents a Script with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class Script extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the Script class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the Script.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.Script & object;
+    if (isObject(model)) {
+      if (typeof (model as Specification.ExternalScript).source === 'object')
+        (self as Specification.ExternalScript).source = new _ExternalResource(
+          (model as Specification.ExternalScript).source as Specification.ExternalResource,
+        );
+    }
+    getLifecycleHooks('Script')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the Script.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new Script(this as any) as ScriptIntersection;
+    validate('Script', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the Script.
+   * Creates a copy of the Script, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the Script instance.
+   */
+  normalize(): Script & Specification.Script {
+    const copy = new Script(this as any) as ScriptIntersection;
+    return getLifecycleHooks('Script')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _Script = Script as ScriptConstructor;
diff --git a/src/lib/generated/classes/secret-based-authentication-policy.ts b/src/lib/generated/classes/secret-based-authentication-policy.ts
new file mode 100644
index 00000000..773ee552
--- /dev/null
+++ b/src/lib/generated/classes/secret-based-authentication-policy.ts
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the SecretBasedAuthenticationPolicy class and type
+ */
+export type SecretBasedAuthenticationPolicyIntersection = SecretBasedAuthenticationPolicy &
+  Specification.SecretBasedAuthenticationPolicy;
+
+/**
+ * Represents a constructor for the intersection of the SecretBasedAuthenticationPolicy class and type
+ */
+export interface SecretBasedAuthenticationPolicyConstructor {
+  new (model?: Partial): SecretBasedAuthenticationPolicyIntersection;
+}
+
+/**
+ * Represents a SecretBasedAuthenticationPolicy with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class SecretBasedAuthenticationPolicy extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the SecretBasedAuthenticationPolicy class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the SecretBasedAuthenticationPolicy.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('SecretBasedAuthenticationPolicy')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the SecretBasedAuthenticationPolicy.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new SecretBasedAuthenticationPolicy(this as any) as SecretBasedAuthenticationPolicyIntersection;
+    validate('SecretBasedAuthenticationPolicy', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the SecretBasedAuthenticationPolicy.
+   * Creates a copy of the SecretBasedAuthenticationPolicy, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the SecretBasedAuthenticationPolicy instance.
+   */
+  normalize(): SecretBasedAuthenticationPolicy & Specification.SecretBasedAuthenticationPolicy {
+    const copy = new SecretBasedAuthenticationPolicy(this as any) as SecretBasedAuthenticationPolicyIntersection;
+    return getLifecycleHooks('SecretBasedAuthenticationPolicy')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _SecretBasedAuthenticationPolicy =
+  SecretBasedAuthenticationPolicy as SecretBasedAuthenticationPolicyConstructor;
diff --git a/src/lib/generated/classes/set-task-configuration.ts b/src/lib/generated/classes/set-task-configuration.ts
new file mode 100644
index 00000000..8e7e17a5
--- /dev/null
+++ b/src/lib/generated/classes/set-task-configuration.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the SetTaskConfiguration class and type
+ */
+export type SetTaskConfigurationIntersection = SetTaskConfiguration & Specification.SetTaskConfiguration;
+
+/**
+ * Represents a constructor for the intersection of the SetTaskConfiguration class and type
+ */
+export interface SetTaskConfigurationConstructor {
+  new (model?: Partial): SetTaskConfigurationIntersection;
+}
+
+/**
+ * Represents a SetTaskConfiguration with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class SetTaskConfiguration extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the SetTaskConfiguration class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the SetTaskConfiguration.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('SetTaskConfiguration')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the SetTaskConfiguration.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new SetTaskConfiguration(this as any) as SetTaskConfigurationIntersection;
+    validate('SetTaskConfiguration', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the SetTaskConfiguration.
+   * Creates a copy of the SetTaskConfiguration, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the SetTaskConfiguration instance.
+   */
+  normalize(): SetTaskConfiguration & Specification.SetTaskConfiguration {
+    const copy = new SetTaskConfiguration(this as any) as SetTaskConfigurationIntersection;
+    return getLifecycleHooks('SetTaskConfiguration')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _SetTaskConfiguration = SetTaskConfiguration as SetTaskConfigurationConstructor;
diff --git a/src/lib/generated/classes/set-task.ts b/src/lib/generated/classes/set-task.ts
new file mode 100644
index 00000000..114a6194
--- /dev/null
+++ b/src/lib/generated/classes/set-task.ts
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Input } from './input';
+import { _Output } from './output';
+import { _Export } from './export';
+import { _TaskTimeout } from './task-timeout';
+import { _TaskMetadata } from './task-metadata';
+import { _SetTaskConfiguration } from './set-task-configuration';
+import { _TaskBase } from './task-base';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the SetTask class and type
+ */
+export type SetTaskIntersection = SetTask & Specification.SetTask;
+
+/**
+ * Represents a constructor for the intersection of the SetTask class and type
+ */
+export interface SetTaskConstructor {
+  new (model?: Partial): SetTaskIntersection;
+}
+
+/**
+ * Represents a SetTask with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class SetTask extends _TaskBase {
+  /**
+   * Instanciates a new instance of the SetTask class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the SetTask.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.SetTask & object;
+    if (isObject(model)) {
+      if (typeof model.input === 'object') self.input = new _Input(model.input);
+      if (typeof model.output === 'object') self.output = new _Output(model.output);
+      if (typeof model.export === 'object') self.export = new _Export(model.export);
+      if (typeof model.timeout === 'object') self.timeout = new _TaskTimeout(model.timeout);
+      if (typeof model.metadata === 'object') self.metadata = new _TaskMetadata(model.metadata);
+      if (typeof model.set === 'object') self.set = new _SetTaskConfiguration(model.set);
+    }
+    getLifecycleHooks('SetTask')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the SetTask.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new SetTask(this as any) as SetTaskIntersection;
+    validate('SetTask', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the SetTask.
+   * Creates a copy of the SetTask, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the SetTask instance.
+   */
+  normalize(): SetTask & Specification.SetTask {
+    const copy = new SetTask(this as any) as SetTaskIntersection;
+    return getLifecycleHooks('SetTask')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _SetTask = SetTask as SetTaskConstructor;
diff --git a/src/lib/generated/classes/shell-arguments.ts b/src/lib/generated/classes/shell-arguments.ts
new file mode 100644
index 00000000..25e0c1b5
--- /dev/null
+++ b/src/lib/generated/classes/shell-arguments.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the ShellArguments class and type
+ */
+export type ShellArgumentsIntersection = ShellArguments & Specification.ShellArguments;
+
+/**
+ * Represents a constructor for the intersection of the ShellArguments class and type
+ */
+export interface ShellArgumentsConstructor {
+  new (model?: Partial): ShellArgumentsIntersection;
+}
+
+/**
+ * Represents a ShellArguments with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ShellArguments extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the ShellArguments class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ShellArguments.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('ShellArguments')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ShellArguments.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ShellArguments(this as any) as ShellArgumentsIntersection;
+    validate('ShellArguments', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ShellArguments.
+   * Creates a copy of the ShellArguments, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ShellArguments instance.
+   */
+  normalize(): ShellArguments & Specification.ShellArguments {
+    const copy = new ShellArguments(this as any) as ShellArgumentsIntersection;
+    return getLifecycleHooks('ShellArguments')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ShellArguments = ShellArguments as ShellArgumentsConstructor;
diff --git a/src/lib/generated/classes/shell-environment.ts b/src/lib/generated/classes/shell-environment.ts
new file mode 100644
index 00000000..8053bf26
--- /dev/null
+++ b/src/lib/generated/classes/shell-environment.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the ShellEnvironment class and type
+ */
+export type ShellEnvironmentIntersection = ShellEnvironment & Specification.ShellEnvironment;
+
+/**
+ * Represents a constructor for the intersection of the ShellEnvironment class and type
+ */
+export interface ShellEnvironmentConstructor {
+  new (model?: Partial): ShellEnvironmentIntersection;
+}
+
+/**
+ * Represents a ShellEnvironment with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class ShellEnvironment extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the ShellEnvironment class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the ShellEnvironment.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('ShellEnvironment')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the ShellEnvironment.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new ShellEnvironment(this as any) as ShellEnvironmentIntersection;
+    validate('ShellEnvironment', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the ShellEnvironment.
+   * Creates a copy of the ShellEnvironment, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the ShellEnvironment instance.
+   */
+  normalize(): ShellEnvironment & Specification.ShellEnvironment {
+    const copy = new ShellEnvironment(this as any) as ShellEnvironmentIntersection;
+    return getLifecycleHooks('ShellEnvironment')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _ShellEnvironment = ShellEnvironment as ShellEnvironmentConstructor;
diff --git a/src/lib/generated/classes/shell.ts b/src/lib/generated/classes/shell.ts
new file mode 100644
index 00000000..1036fc31
--- /dev/null
+++ b/src/lib/generated/classes/shell.ts
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _ShellArguments } from './shell-arguments';
+import { _ShellEnvironment } from './shell-environment';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the Shell class and type
+ */
+export type ShellIntersection = Shell & Specification.Shell;
+
+/**
+ * Represents a constructor for the intersection of the Shell class and type
+ */
+export interface ShellConstructor {
+  new (model?: Partial): ShellIntersection;
+}
+
+/**
+ * Represents a Shell with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class Shell extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the Shell class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the Shell.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.Shell & object;
+    if (isObject(model)) {
+      if (typeof model.arguments === 'object') self.arguments = new _ShellArguments(model.arguments);
+      if (typeof model.environment === 'object') self.environment = new _ShellEnvironment(model.environment);
+    }
+    getLifecycleHooks('Shell')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the Shell.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new Shell(this as any) as ShellIntersection;
+    validate('Shell', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the Shell.
+   * Creates a copy of the Shell, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the Shell instance.
+   */
+  normalize(): Shell & Specification.Shell {
+    const copy = new Shell(this as any) as ShellIntersection;
+    return getLifecycleHooks('Shell')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _Shell = Shell as ShellConstructor;
diff --git a/src/lib/generated/classes/subflow-configuration.ts b/src/lib/generated/classes/subflow-configuration.ts
new file mode 100644
index 00000000..908ddba9
--- /dev/null
+++ b/src/lib/generated/classes/subflow-configuration.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _SubflowInput } from './subflow-input';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the SubflowConfiguration class and type
+ */
+export type SubflowConfigurationIntersection = SubflowConfiguration & Specification.SubflowConfiguration;
+
+/**
+ * Represents a constructor for the intersection of the SubflowConfiguration class and type
+ */
+export interface SubflowConfigurationConstructor {
+  new (model?: Partial): SubflowConfigurationIntersection;
+}
+
+/**
+ * Represents a SubflowConfiguration with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class SubflowConfiguration extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the SubflowConfiguration class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the SubflowConfiguration.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.SubflowConfiguration & object;
+    if (isObject(model)) {
+      if (typeof model.input === 'object') self.input = new _SubflowInput(model.input);
+    }
+    getLifecycleHooks('SubflowConfiguration')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the SubflowConfiguration.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new SubflowConfiguration(this as any) as SubflowConfigurationIntersection;
+    validate('SubflowConfiguration', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the SubflowConfiguration.
+   * Creates a copy of the SubflowConfiguration, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the SubflowConfiguration instance.
+   */
+  normalize(): SubflowConfiguration & Specification.SubflowConfiguration {
+    const copy = new SubflowConfiguration(this as any) as SubflowConfigurationIntersection;
+    return getLifecycleHooks('SubflowConfiguration')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _SubflowConfiguration = SubflowConfiguration as SubflowConfigurationConstructor;
diff --git a/src/lib/generated/classes/subflow-input.ts b/src/lib/generated/classes/subflow-input.ts
new file mode 100644
index 00000000..eb6ea842
--- /dev/null
+++ b/src/lib/generated/classes/subflow-input.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the SubflowInput class and type
+ */
+export type SubflowInputIntersection = SubflowInput & Specification.SubflowInput;
+
+/**
+ * Represents a constructor for the intersection of the SubflowInput class and type
+ */
+export interface SubflowInputConstructor {
+  new (model?: Partial): SubflowInputIntersection;
+}
+
+/**
+ * Represents a SubflowInput with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class SubflowInput extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the SubflowInput class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the SubflowInput.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('SubflowInput')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the SubflowInput.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new SubflowInput(this as any) as SubflowInputIntersection;
+    validate('SubflowInput', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the SubflowInput.
+   * Creates a copy of the SubflowInput, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the SubflowInput instance.
+   */
+  normalize(): SubflowInput & Specification.SubflowInput {
+    const copy = new SubflowInput(this as any) as SubflowInputIntersection;
+    return getLifecycleHooks('SubflowInput')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _SubflowInput = SubflowInput as SubflowInputConstructor;
diff --git a/src/lib/generated/classes/subscription-iterator.ts b/src/lib/generated/classes/subscription-iterator.ts
new file mode 100644
index 00000000..87162f5b
--- /dev/null
+++ b/src/lib/generated/classes/subscription-iterator.ts
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _TaskList } from './task-list';
+import { _Output } from './output';
+import { _Export } from './export';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the SubscriptionIterator class and type
+ */
+export type SubscriptionIteratorIntersection = SubscriptionIterator & Specification.SubscriptionIterator;
+
+/**
+ * Represents a constructor for the intersection of the SubscriptionIterator class and type
+ */
+export interface SubscriptionIteratorConstructor {
+  new (model?: Partial): SubscriptionIteratorIntersection;
+}
+
+/**
+ * Represents a SubscriptionIterator with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class SubscriptionIterator extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the SubscriptionIterator class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the SubscriptionIterator.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.SubscriptionIterator & object;
+    if (isObject(model)) {
+      if (typeof model.do === 'object') self.do = new _TaskList(model.do);
+      if (typeof model.output === 'object') self.output = new _Output(model.output);
+      if (typeof model.export === 'object') self.export = new _Export(model.export);
+    }
+    getLifecycleHooks('SubscriptionIterator')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the SubscriptionIterator.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new SubscriptionIterator(this as any) as SubscriptionIteratorIntersection;
+    validate('SubscriptionIterator', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the SubscriptionIterator.
+   * Creates a copy of the SubscriptionIterator, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the SubscriptionIterator instance.
+   */
+  normalize(): SubscriptionIterator & Specification.SubscriptionIterator {
+    const copy = new SubscriptionIterator(this as any) as SubscriptionIteratorIntersection;
+    return getLifecycleHooks('SubscriptionIterator')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _SubscriptionIterator = SubscriptionIterator as SubscriptionIteratorConstructor;
diff --git a/src/lib/generated/classes/switch-case.ts b/src/lib/generated/classes/switch-case.ts
new file mode 100644
index 00000000..975a208b
--- /dev/null
+++ b/src/lib/generated/classes/switch-case.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the SwitchCase class and type
+ */
+export type SwitchCaseIntersection = SwitchCase & Specification.SwitchCase;
+
+/**
+ * Represents a constructor for the intersection of the SwitchCase class and type
+ */
+export interface SwitchCaseConstructor {
+  new (model?: Partial): SwitchCaseIntersection;
+}
+
+/**
+ * Represents a SwitchCase with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class SwitchCase extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the SwitchCase class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the SwitchCase.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('SwitchCase')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the SwitchCase.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new SwitchCase(this as any) as SwitchCaseIntersection;
+    validate('SwitchCase', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the SwitchCase.
+   * Creates a copy of the SwitchCase, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the SwitchCase instance.
+   */
+  normalize(): SwitchCase & Specification.SwitchCase {
+    const copy = new SwitchCase(this as any) as SwitchCaseIntersection;
+    return getLifecycleHooks('SwitchCase')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _SwitchCase = SwitchCase as SwitchCaseConstructor;
diff --git a/src/lib/generated/classes/switch-item.ts b/src/lib/generated/classes/switch-item.ts
new file mode 100644
index 00000000..245ddb79
--- /dev/null
+++ b/src/lib/generated/classes/switch-item.ts
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _SwitchCase } from './switch-case';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the SwitchItem class and type
+ */
+export type SwitchItemIntersection = SwitchItem & Specification.SwitchItem;
+
+/**
+ * Represents a constructor for the intersection of the SwitchItem class and type
+ */
+export interface SwitchItemConstructor {
+  new (model?: Partial): SwitchItemIntersection;
+}
+
+/**
+ * Represents a SwitchItem with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class SwitchItem extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the SwitchItem class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the SwitchItem.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.SwitchItem & object;
+    if (isObject(model)) {
+      const knownProperties: string[] = [];
+      Object.entries(model)
+        .filter(([key]) => !knownProperties.includes(key))
+        .forEach(([key, value]) => {
+          self[key] = new _SwitchCase(value);
+        });
+    }
+    getLifecycleHooks('SwitchItem')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the SwitchItem.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new SwitchItem(this as any) as SwitchItemIntersection;
+    validate('SwitchItem', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the SwitchItem.
+   * Creates a copy of the SwitchItem, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the SwitchItem instance.
+   */
+  normalize(): SwitchItem & Specification.SwitchItem {
+    const copy = new SwitchItem(this as any) as SwitchItemIntersection;
+    return getLifecycleHooks('SwitchItem')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _SwitchItem = SwitchItem as SwitchItemConstructor;
diff --git a/src/lib/generated/classes/switch-task-configuration.ts b/src/lib/generated/classes/switch-task-configuration.ts
new file mode 100644
index 00000000..647c5cb5
--- /dev/null
+++ b/src/lib/generated/classes/switch-task-configuration.ts
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _SwitchItem } from './switch-item';
+import { Specification } from '../definitions';
+import { ArrayHydrator } from '../../hydrator';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the SwitchTaskConfiguration class and type
+ */
+export type SwitchTaskConfigurationIntersection = SwitchTaskConfiguration & Specification.SwitchTaskConfiguration;
+
+/**
+ * Represents a constructor for the intersection of the SwitchTaskConfiguration class and type
+ */
+export interface SwitchTaskConfigurationConstructor {
+  new (model?: Array | number): SwitchTaskConfigurationIntersection;
+}
+
+/**
+ * Represents a collection of Specification.SwitchItem.
+ * Inherits from ArrayHydrator to handle array-specific hydration.
+ */
+export class SwitchTaskConfiguration extends ArrayHydrator {
+  /**
+   * Constructs a new instance of the SwitchTaskConfiguration class.
+   *
+   * @param model - Optional parameter which can be an array of objects or a number representing the array length.
+   */
+  constructor(model?: Array | number) {
+    super(model);
+    if (Array.isArray(model)) {
+      if (model?.length) {
+        this.splice(0, this.length);
+        model.forEach((item) => this.push(new _SwitchItem(item)));
+      }
+    }
+    Object.setPrototypeOf(this, Object.create(SwitchTaskConfiguration.prototype));
+    getLifecycleHooks('SwitchTaskConfiguration')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the SwitchTaskConfiguration.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new SwitchTaskConfiguration(this);
+    validate('SwitchTaskConfiguration', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the SwitchTaskConfiguration.
+   * Creates a copy of the SwitchTaskConfiguration, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the SwitchTaskConfiguration instance.
+   */
+  normalize(): SwitchTaskConfiguration {
+    const copy = new SwitchTaskConfiguration(this);
+    return getLifecycleHooks('SwitchTaskConfiguration')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _SwitchTaskConfiguration = SwitchTaskConfiguration as unknown as SwitchTaskConfigurationConstructor;
+//export const _SwitchTaskConfiguration = SwitchTaskConfiguration; // could be exported directly, but it makes the job of building the index more straightforward as it's consistant with "object" classes
diff --git a/src/lib/generated/classes/switch-task.ts b/src/lib/generated/classes/switch-task.ts
new file mode 100644
index 00000000..71bf5e88
--- /dev/null
+++ b/src/lib/generated/classes/switch-task.ts
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Input } from './input';
+import { _Output } from './output';
+import { _Export } from './export';
+import { _TaskTimeout } from './task-timeout';
+import { _TaskMetadata } from './task-metadata';
+import { _SwitchTaskConfiguration } from './switch-task-configuration';
+import { _TaskBase } from './task-base';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the SwitchTask class and type
+ */
+export type SwitchTaskIntersection = SwitchTask & Specification.SwitchTask;
+
+/**
+ * Represents a constructor for the intersection of the SwitchTask class and type
+ */
+export interface SwitchTaskConstructor {
+  new (model?: Partial): SwitchTaskIntersection;
+}
+
+/**
+ * Represents a SwitchTask with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class SwitchTask extends _TaskBase {
+  /**
+   * Instanciates a new instance of the SwitchTask class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the SwitchTask.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.SwitchTask & object;
+    if (isObject(model)) {
+      if (typeof model.input === 'object') self.input = new _Input(model.input);
+      if (typeof model.output === 'object') self.output = new _Output(model.output);
+      if (typeof model.export === 'object') self.export = new _Export(model.export);
+      if (typeof model.timeout === 'object') self.timeout = new _TaskTimeout(model.timeout);
+      if (typeof model.metadata === 'object') self.metadata = new _TaskMetadata(model.metadata);
+      if (typeof model.switch === 'object')
+        self.switch = new _SwitchTaskConfiguration(model.switch) as unknown as Specification.SwitchTaskConfiguration;
+    }
+    getLifecycleHooks('SwitchTask')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the SwitchTask.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new SwitchTask(this as any) as SwitchTaskIntersection;
+    validate('SwitchTask', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the SwitchTask.
+   * Creates a copy of the SwitchTask, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the SwitchTask instance.
+   */
+  normalize(): SwitchTask & Specification.SwitchTask {
+    const copy = new SwitchTask(this as any) as SwitchTaskIntersection;
+    return getLifecycleHooks('SwitchTask')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _SwitchTask = SwitchTask as SwitchTaskConstructor;
diff --git a/src/lib/generated/classes/task-base-if.ts b/src/lib/generated/classes/task-base-if.ts
new file mode 100644
index 00000000..c47e03af
--- /dev/null
+++ b/src/lib/generated/classes/task-base-if.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the TaskBaseIf class and type
+ */
+export type TaskBaseIfIntersection = TaskBaseIf & Specification.TaskBaseIf;
+
+/**
+ * Represents a constructor for the intersection of the TaskBaseIf class and type
+ */
+export interface TaskBaseIfConstructor {
+  new (model?: Partial): TaskBaseIfIntersection;
+}
+
+/**
+ * Represents a TaskBaseIf with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class TaskBaseIf extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the TaskBaseIf class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the TaskBaseIf.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('TaskBaseIf')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the TaskBaseIf.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new TaskBaseIf(this as any) as TaskBaseIfIntersection;
+    validate('TaskBaseIf', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the TaskBaseIf.
+   * Creates a copy of the TaskBaseIf, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the TaskBaseIf instance.
+   */
+  normalize(): TaskBaseIf & Specification.TaskBaseIf {
+    const copy = new TaskBaseIf(this as any) as TaskBaseIfIntersection;
+    return getLifecycleHooks('TaskBaseIf')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _TaskBaseIf = TaskBaseIf as TaskBaseIfConstructor;
diff --git a/src/lib/generated/classes/task-base.ts b/src/lib/generated/classes/task-base.ts
new file mode 100644
index 00000000..03510f0e
--- /dev/null
+++ b/src/lib/generated/classes/task-base.ts
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Input } from './input';
+import { _Output } from './output';
+import { _Export } from './export';
+import { _TaskTimeout } from './task-timeout';
+import { _TaskMetadata } from './task-metadata';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the TaskBase class and type
+ */
+export type TaskBaseIntersection = TaskBase & Specification.TaskBase;
+
+/**
+ * Represents a constructor for the intersection of the TaskBase class and type
+ */
+export interface TaskBaseConstructor {
+  new (model?: Partial): TaskBaseIntersection;
+}
+
+/**
+ * Represents a TaskBase with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class TaskBase extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the TaskBase class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the TaskBase.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.TaskBase & object;
+    if (isObject(model)) {
+      if (typeof model.input === 'object') self.input = new _Input(model.input);
+      if (typeof model.output === 'object') self.output = new _Output(model.output);
+      if (typeof model.export === 'object') self.export = new _Export(model.export);
+      if (typeof model.timeout === 'object') self.timeout = new _TaskTimeout(model.timeout);
+      if (typeof model.metadata === 'object') self.metadata = new _TaskMetadata(model.metadata);
+    }
+    getLifecycleHooks('TaskBase')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the TaskBase.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new TaskBase(this as any) as TaskBaseIntersection;
+    validate('TaskBase', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the TaskBase.
+   * Creates a copy of the TaskBase, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the TaskBase instance.
+   */
+  normalize(): TaskBase & Specification.TaskBase {
+    const copy = new TaskBase(this as any) as TaskBaseIntersection;
+    return getLifecycleHooks('TaskBase')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _TaskBase = TaskBase as TaskBaseConstructor;
diff --git a/src/lib/generated/classes/task-item.ts b/src/lib/generated/classes/task-item.ts
new file mode 100644
index 00000000..d4301689
--- /dev/null
+++ b/src/lib/generated/classes/task-item.ts
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Task } from './task';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the TaskItem class and type
+ */
+export type TaskItemIntersection = TaskItem & Specification.TaskItem;
+
+/**
+ * Represents a constructor for the intersection of the TaskItem class and type
+ */
+export interface TaskItemConstructor {
+  new (model?: Partial): TaskItemIntersection;
+}
+
+/**
+ * Represents a TaskItem with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class TaskItem extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the TaskItem class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the TaskItem.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.TaskItem & object;
+    if (isObject(model)) {
+      const knownProperties: string[] = [];
+      Object.entries(model)
+        .filter(([key]) => !knownProperties.includes(key))
+        .forEach(([key, value]) => {
+          self[key] = new _Task(value);
+        });
+    }
+    getLifecycleHooks('TaskItem')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the TaskItem.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new TaskItem(this as any) as TaskItemIntersection;
+    validate('TaskItem', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the TaskItem.
+   * Creates a copy of the TaskItem, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the TaskItem instance.
+   */
+  normalize(): TaskItem & Specification.TaskItem {
+    const copy = new TaskItem(this as any) as TaskItemIntersection;
+    return getLifecycleHooks('TaskItem')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _TaskItem = TaskItem as TaskItemConstructor;
diff --git a/src/lib/generated/classes/task-list.ts b/src/lib/generated/classes/task-list.ts
new file mode 100644
index 00000000..3b39a89e
--- /dev/null
+++ b/src/lib/generated/classes/task-list.ts
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _TaskItem } from './task-item';
+import { Specification } from '../definitions';
+import { ArrayHydrator } from '../../hydrator';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the TaskList class and type
+ */
+export type TaskListIntersection = TaskList & Specification.TaskList;
+
+/**
+ * Represents a constructor for the intersection of the TaskList class and type
+ */
+export interface TaskListConstructor {
+  new (model?: Array | number): TaskListIntersection;
+}
+
+/**
+ * Represents a collection of Specification.TaskItem.
+ * Inherits from ArrayHydrator to handle array-specific hydration.
+ */
+export class TaskList extends ArrayHydrator {
+  /**
+   * Constructs a new instance of the TaskList class.
+   *
+   * @param model - Optional parameter which can be an array of objects or a number representing the array length.
+   */
+  constructor(model?: Array | number) {
+    super(model);
+    if (Array.isArray(model)) {
+      if (model?.length) {
+        this.splice(0, this.length);
+        model.forEach((item) => this.push(new _TaskItem(item)));
+      }
+    }
+    Object.setPrototypeOf(this, Object.create(TaskList.prototype));
+    getLifecycleHooks('TaskList')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the TaskList.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new TaskList(this);
+    validate('TaskList', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the TaskList.
+   * Creates a copy of the TaskList, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the TaskList instance.
+   */
+  normalize(): TaskList {
+    const copy = new TaskList(this);
+    return getLifecycleHooks('TaskList')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _TaskList = TaskList as unknown as TaskListConstructor;
+//export const _TaskList = TaskList; // could be exported directly, but it makes the job of building the index more straightforward as it's consistant with "object" classes
diff --git a/src/lib/generated/classes/task-metadata.ts b/src/lib/generated/classes/task-metadata.ts
new file mode 100644
index 00000000..837f73d9
--- /dev/null
+++ b/src/lib/generated/classes/task-metadata.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the TaskMetadata class and type
+ */
+export type TaskMetadataIntersection = TaskMetadata & Specification.TaskMetadata;
+
+/**
+ * Represents a constructor for the intersection of the TaskMetadata class and type
+ */
+export interface TaskMetadataConstructor {
+  new (model?: Partial): TaskMetadataIntersection;
+}
+
+/**
+ * Represents a TaskMetadata with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class TaskMetadata extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the TaskMetadata class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the TaskMetadata.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('TaskMetadata')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the TaskMetadata.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new TaskMetadata(this as any) as TaskMetadataIntersection;
+    validate('TaskMetadata', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the TaskMetadata.
+   * Creates a copy of the TaskMetadata, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the TaskMetadata instance.
+   */
+  normalize(): TaskMetadata & Specification.TaskMetadata {
+    const copy = new TaskMetadata(this as any) as TaskMetadataIntersection;
+    return getLifecycleHooks('TaskMetadata')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _TaskMetadata = TaskMetadata as TaskMetadataConstructor;
diff --git a/src/lib/generated/classes/task-timeout.ts b/src/lib/generated/classes/task-timeout.ts
new file mode 100644
index 00000000..762f8f2f
--- /dev/null
+++ b/src/lib/generated/classes/task-timeout.ts
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Duration } from './duration';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the TaskTimeout class and type
+ */
+export type TaskTimeoutIntersection = TaskTimeout & Specification.TaskTimeout;
+
+/**
+ * Represents a constructor for the intersection of the TaskTimeout class and type
+ */
+export interface TaskTimeoutConstructor {
+  new (model?: Partial): TaskTimeoutIntersection;
+}
+
+/**
+ * Represents a TaskTimeout with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class TaskTimeout extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the TaskTimeout class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the TaskTimeout.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.TaskTimeout & object;
+    if (isObject(model)) {
+      if (typeof (model as Specification.Timeout).after === 'object')
+        (self as Specification.Timeout).after = new _Duration(
+          (model as Specification.Timeout).after as Specification.Duration,
+        );
+    }
+    getLifecycleHooks('TaskTimeout')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the TaskTimeout.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new TaskTimeout(this as any) as TaskTimeoutIntersection;
+    validate('TaskTimeout', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the TaskTimeout.
+   * Creates a copy of the TaskTimeout, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the TaskTimeout instance.
+   */
+  normalize(): TaskTimeout & Specification.TaskTimeout {
+    const copy = new TaskTimeout(this as any) as TaskTimeoutIntersection;
+    return getLifecycleHooks('TaskTimeout')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _TaskTimeout = TaskTimeout as TaskTimeoutConstructor;
diff --git a/src/lib/generated/classes/task.ts b/src/lib/generated/classes/task.ts
new file mode 100644
index 00000000..c2ce7a9e
--- /dev/null
+++ b/src/lib/generated/classes/task.ts
@@ -0,0 +1,251 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Input } from './input';
+import { _Output } from './output';
+import { _Export } from './export';
+import { _TaskTimeout } from './task-timeout';
+import { _TaskMetadata } from './task-metadata';
+import { _ForkTaskConfiguration } from './fork-task-configuration';
+import { _EmitTaskConfiguration } from './emit-task-configuration';
+import { _ForTaskConfiguration } from './for-task-configuration';
+import { _ListenTaskConfiguration } from './listen-task-configuration';
+import { _SubscriptionIterator } from './subscription-iterator';
+import { _RaiseTaskConfiguration } from './raise-task-configuration';
+import { _RunTaskConfiguration } from './run-task-configuration';
+import { _SetTaskConfiguration } from './set-task-configuration';
+import { _SwitchTaskConfiguration } from './switch-task-configuration';
+import { _TaskList } from './task-list';
+import { _TryTaskCatch } from './try-task-catch';
+import { _Duration } from './duration';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the Task class and type
+ */
+export type TaskIntersection = Task & Specification.Task;
+
+/**
+ * Represents a constructor for the intersection of the Task class and type
+ */
+export interface TaskConstructor {
+  new (model?: Partial): TaskIntersection;
+}
+
+/**
+ * Represents a Task with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class Task extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the Task class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the Task.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.Task & object;
+    if (isObject(model)) {
+      if (typeof (model as Specification.TaskBase).input === 'object')
+        (self as Specification.TaskBase).input = new _Input(
+          (model as Specification.TaskBase).input as Specification.Input,
+        );
+      if (typeof (model as Specification.TaskBase).output === 'object')
+        (self as Specification.TaskBase).output = new _Output(
+          (model as Specification.TaskBase).output as Specification.Output,
+        );
+      if (typeof (model as Specification.TaskBase).export === 'object')
+        (self as Specification.TaskBase).export = new _Export(
+          (model as Specification.TaskBase).export as Specification.Export,
+        );
+      if (typeof (model as Specification.TaskBase).timeout === 'object')
+        (self as Specification.TaskBase).timeout = new _TaskTimeout(
+          (model as Specification.TaskBase).timeout as Specification.TaskTimeout,
+        );
+      if (typeof (model as Specification.TaskBase).metadata === 'object')
+        (self as Specification.TaskBase).metadata = new _TaskMetadata(
+          (model as Specification.TaskBase).metadata as Specification.TaskMetadata,
+        );
+      if (typeof (model as { [k: string]: unknown; fork?: Specification.ForkTaskConfiguration }).fork === 'object')
+        (self as { [k: string]: unknown; fork?: Specification.ForkTaskConfiguration }).fork =
+          new _ForkTaskConfiguration(
+            (model as { [k: string]: unknown; fork?: Specification.ForkTaskConfiguration })
+              .fork as Specification.ForkTaskConfiguration,
+          );
+      if (typeof (model as { [k: string]: unknown; emit?: Specification.EmitTaskConfiguration }).emit === 'object')
+        (self as { [k: string]: unknown; emit?: Specification.EmitTaskConfiguration }).emit =
+          new _EmitTaskConfiguration(
+            (model as { [k: string]: unknown; emit?: Specification.EmitTaskConfiguration })
+              .emit as Specification.EmitTaskConfiguration,
+          );
+      if (
+        typeof (
+          model as {
+            [k: string]: unknown;
+            for?: Specification.ForTaskConfiguration;
+            while?: string;
+            do?: Specification.TaskList;
+          }
+        ).for === 'object'
+      )
+        (
+          self as {
+            [k: string]: unknown;
+            for?: Specification.ForTaskConfiguration;
+            while?: string;
+            do?: Specification.TaskList;
+          }
+        ).for = new _ForTaskConfiguration(
+          (
+            model as {
+              [k: string]: unknown;
+              for?: Specification.ForTaskConfiguration;
+              while?: string;
+              do?: Specification.TaskList;
+            }
+          ).for as Specification.ForTaskConfiguration,
+        );
+      if (
+        typeof (
+          model as {
+            [k: string]: unknown;
+            listen?: Specification.ListenTaskConfiguration;
+            foreach?: Specification.SubscriptionIterator;
+          }
+        ).listen === 'object'
+      )
+        (
+          self as {
+            [k: string]: unknown;
+            listen?: Specification.ListenTaskConfiguration;
+            foreach?: Specification.SubscriptionIterator;
+          }
+        ).listen = new _ListenTaskConfiguration(
+          (
+            model as {
+              [k: string]: unknown;
+              listen?: Specification.ListenTaskConfiguration;
+              foreach?: Specification.SubscriptionIterator;
+            }
+          ).listen as Specification.ListenTaskConfiguration,
+        );
+      if (
+        typeof (
+          model as {
+            [k: string]: unknown;
+            listen?: Specification.ListenTaskConfiguration;
+            foreach?: Specification.SubscriptionIterator;
+          }
+        ).foreach === 'object'
+      )
+        (
+          self as {
+            [k: string]: unknown;
+            listen?: Specification.ListenTaskConfiguration;
+            foreach?: Specification.SubscriptionIterator;
+          }
+        ).foreach = new _SubscriptionIterator(
+          (
+            model as {
+              [k: string]: unknown;
+              listen?: Specification.ListenTaskConfiguration;
+              foreach?: Specification.SubscriptionIterator;
+            }
+          ).foreach as Specification.SubscriptionIterator,
+        );
+      if (typeof (model as { [k: string]: unknown; raise?: Specification.RaiseTaskConfiguration }).raise === 'object')
+        (self as { [k: string]: unknown; raise?: Specification.RaiseTaskConfiguration }).raise =
+          new _RaiseTaskConfiguration(
+            (model as { [k: string]: unknown; raise?: Specification.RaiseTaskConfiguration })
+              .raise as Specification.RaiseTaskConfiguration,
+          );
+      if (typeof (model as { [k: string]: unknown; run?: Specification.RunTaskConfiguration }).run === 'object')
+        (self as { [k: string]: unknown; run?: Specification.RunTaskConfiguration }).run = new _RunTaskConfiguration(
+          (model as { [k: string]: unknown; run?: Specification.RunTaskConfiguration })
+            .run as Specification.RunTaskConfiguration,
+        );
+      if (typeof (model as { [k: string]: unknown; set?: Specification.SetTaskConfiguration }).set === 'object')
+        (self as { [k: string]: unknown; set?: Specification.SetTaskConfiguration }).set = new _SetTaskConfiguration(
+          (model as { [k: string]: unknown; set?: Specification.SetTaskConfiguration })
+            .set as Specification.SetTaskConfiguration,
+        );
+      if (
+        typeof (model as { [k: string]: unknown; switch?: Specification.SwitchTaskConfiguration }).switch === 'object'
+      )
+        (self as { [k: string]: unknown; switch?: Specification.SwitchTaskConfiguration }).switch =
+          new _SwitchTaskConfiguration(
+            (model as { [k: string]: unknown; switch?: Specification.SwitchTaskConfiguration })
+              .switch as Specification.SwitchTaskConfiguration,
+          ) as unknown as Specification.SwitchTaskConfiguration;
+      if (
+        typeof (model as { [k: string]: unknown; try?: Specification.TaskList; catch?: Specification.TryTaskCatch })
+          .try === 'object'
+      )
+        (self as { [k: string]: unknown; try?: Specification.TaskList; catch?: Specification.TryTaskCatch }).try =
+          new _TaskList(
+            (model as { [k: string]: unknown; try?: Specification.TaskList; catch?: Specification.TryTaskCatch })
+              .try as Specification.TaskList,
+          );
+      if (
+        typeof (model as { [k: string]: unknown; try?: Specification.TaskList; catch?: Specification.TryTaskCatch })
+          .catch === 'object'
+      )
+        (self as { [k: string]: unknown; try?: Specification.TaskList; catch?: Specification.TryTaskCatch }).catch =
+          new _TryTaskCatch(
+            (model as { [k: string]: unknown; try?: Specification.TaskList; catch?: Specification.TryTaskCatch })
+              .catch as Specification.TryTaskCatch,
+          );
+      if (typeof (model as { [k: string]: unknown; wait?: Specification.Duration }).wait === 'object')
+        (self as { [k: string]: unknown; wait?: Specification.Duration }).wait = new _Duration(
+          (model as { [k: string]: unknown; wait?: Specification.Duration }).wait as Specification.Duration,
+        );
+    }
+    getLifecycleHooks('Task')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the Task.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new Task(this as any) as TaskIntersection;
+    validate('Task', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the Task.
+   * Creates a copy of the Task, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the Task instance.
+   */
+  normalize(): Task & Specification.Task {
+    const copy = new Task(this as any) as TaskIntersection;
+    return getLifecycleHooks('Task')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _Task = Task as TaskConstructor;
diff --git a/src/lib/generated/classes/timeout.ts b/src/lib/generated/classes/timeout.ts
new file mode 100644
index 00000000..4d9795db
--- /dev/null
+++ b/src/lib/generated/classes/timeout.ts
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Duration } from './duration';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the Timeout class and type
+ */
+export type TimeoutIntersection = Timeout & Specification.Timeout;
+
+/**
+ * Represents a constructor for the intersection of the Timeout class and type
+ */
+export interface TimeoutConstructor {
+  new (model?: Partial): TimeoutIntersection;
+}
+
+/**
+ * Represents a Timeout with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class Timeout extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the Timeout class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the Timeout.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.Timeout & object;
+    if (isObject(model)) {
+      if (typeof model.after === 'object') self.after = new _Duration(model.after);
+    }
+    getLifecycleHooks('Timeout')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the Timeout.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new Timeout(this as any) as TimeoutIntersection;
+    validate('Timeout', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the Timeout.
+   * Creates a copy of the Timeout, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the Timeout instance.
+   */
+  normalize(): Timeout & Specification.Timeout {
+    const copy = new Timeout(this as any) as TimeoutIntersection;
+    return getLifecycleHooks('Timeout')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _Timeout = Timeout as TimeoutConstructor;
diff --git a/src/lib/generated/classes/try-task-catch-retry.ts b/src/lib/generated/classes/try-task-catch-retry.ts
new file mode 100644
index 00000000..dd3db21f
--- /dev/null
+++ b/src/lib/generated/classes/try-task-catch-retry.ts
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Duration } from './duration';
+import { _RetryBackoff } from './retry-backoff';
+import { _RetryLimit } from './retry-limit';
+import { _RetryPolicyJitter } from './retry-policy-jitter';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the TryTaskCatchRetry class and type
+ */
+export type TryTaskCatchRetryIntersection = TryTaskCatchRetry & Specification.TryTaskCatchRetry;
+
+/**
+ * Represents a constructor for the intersection of the TryTaskCatchRetry class and type
+ */
+export interface TryTaskCatchRetryConstructor {
+  new (model?: Partial): TryTaskCatchRetryIntersection;
+}
+
+/**
+ * Represents a TryTaskCatchRetry with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class TryTaskCatchRetry extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the TryTaskCatchRetry class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the TryTaskCatchRetry.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.TryTaskCatchRetry & object;
+    if (isObject(model)) {
+      if (typeof (model as Specification.RetryPolicy).delay === 'object')
+        (self as Specification.RetryPolicy).delay = new _Duration(
+          (model as Specification.RetryPolicy).delay as Specification.Duration,
+        );
+      if (typeof (model as Specification.RetryPolicy).backoff === 'object')
+        (self as Specification.RetryPolicy).backoff = new _RetryBackoff(
+          (model as Specification.RetryPolicy).backoff as Specification.RetryBackoff,
+        );
+      if (typeof (model as Specification.RetryPolicy).limit === 'object')
+        (self as Specification.RetryPolicy).limit = new _RetryLimit(
+          (model as Specification.RetryPolicy).limit as Specification.RetryLimit,
+        );
+      if (typeof (model as Specification.RetryPolicy).jitter === 'object')
+        (self as Specification.RetryPolicy).jitter = new _RetryPolicyJitter(
+          (model as Specification.RetryPolicy).jitter as Specification.RetryPolicyJitter,
+        );
+    }
+    getLifecycleHooks('TryTaskCatchRetry')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the TryTaskCatchRetry.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new TryTaskCatchRetry(this as any) as TryTaskCatchRetryIntersection;
+    validate('TryTaskCatchRetry', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the TryTaskCatchRetry.
+   * Creates a copy of the TryTaskCatchRetry, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the TryTaskCatchRetry instance.
+   */
+  normalize(): TryTaskCatchRetry & Specification.TryTaskCatchRetry {
+    const copy = new TryTaskCatchRetry(this as any) as TryTaskCatchRetryIntersection;
+    return getLifecycleHooks('TryTaskCatchRetry')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _TryTaskCatchRetry = TryTaskCatchRetry as TryTaskCatchRetryConstructor;
diff --git a/src/lib/generated/classes/try-task-catch.ts b/src/lib/generated/classes/try-task-catch.ts
new file mode 100644
index 00000000..33dfdc44
--- /dev/null
+++ b/src/lib/generated/classes/try-task-catch.ts
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _CatchErrors } from './catch-errors';
+import { _TryTaskCatchRetry } from './try-task-catch-retry';
+import { _TaskList } from './task-list';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the TryTaskCatch class and type
+ */
+export type TryTaskCatchIntersection = TryTaskCatch & Specification.TryTaskCatch;
+
+/**
+ * Represents a constructor for the intersection of the TryTaskCatch class and type
+ */
+export interface TryTaskCatchConstructor {
+  new (model?: Partial): TryTaskCatchIntersection;
+}
+
+/**
+ * Represents a TryTaskCatch with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class TryTaskCatch extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the TryTaskCatch class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the TryTaskCatch.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.TryTaskCatch & object;
+    if (isObject(model)) {
+      if (typeof model.errors === 'object') self.errors = new _CatchErrors(model.errors);
+      if (typeof model.retry === 'object') self.retry = new _TryTaskCatchRetry(model.retry);
+      if (typeof model.do === 'object') self.do = new _TaskList(model.do);
+    }
+    getLifecycleHooks('TryTaskCatch')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the TryTaskCatch.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new TryTaskCatch(this as any) as TryTaskCatchIntersection;
+    validate('TryTaskCatch', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the TryTaskCatch.
+   * Creates a copy of the TryTaskCatch, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the TryTaskCatch instance.
+   */
+  normalize(): TryTaskCatch & Specification.TryTaskCatch {
+    const copy = new TryTaskCatch(this as any) as TryTaskCatchIntersection;
+    return getLifecycleHooks('TryTaskCatch')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _TryTaskCatch = TryTaskCatch as TryTaskCatchConstructor;
diff --git a/src/lib/generated/classes/try-task.ts b/src/lib/generated/classes/try-task.ts
new file mode 100644
index 00000000..58cf331a
--- /dev/null
+++ b/src/lib/generated/classes/try-task.ts
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Input } from './input';
+import { _Output } from './output';
+import { _Export } from './export';
+import { _TaskTimeout } from './task-timeout';
+import { _TaskMetadata } from './task-metadata';
+import { _TaskList } from './task-list';
+import { _TryTaskCatch } from './try-task-catch';
+import { _TaskBase } from './task-base';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the TryTask class and type
+ */
+export type TryTaskIntersection = TryTask & Specification.TryTask;
+
+/**
+ * Represents a constructor for the intersection of the TryTask class and type
+ */
+export interface TryTaskConstructor {
+  new (model?: Partial): TryTaskIntersection;
+}
+
+/**
+ * Represents a TryTask with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class TryTask extends _TaskBase {
+  /**
+   * Instanciates a new instance of the TryTask class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the TryTask.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.TryTask & object;
+    if (isObject(model)) {
+      if (typeof model.input === 'object') self.input = new _Input(model.input);
+      if (typeof model.output === 'object') self.output = new _Output(model.output);
+      if (typeof model.export === 'object') self.export = new _Export(model.export);
+      if (typeof model.timeout === 'object') self.timeout = new _TaskTimeout(model.timeout);
+      if (typeof model.metadata === 'object') self.metadata = new _TaskMetadata(model.metadata);
+      if (typeof model.try === 'object') self.try = new _TaskList(model.try);
+      if (typeof model.catch === 'object') self.catch = new _TryTaskCatch(model.catch);
+    }
+    getLifecycleHooks('TryTask')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the TryTask.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new TryTask(this as any) as TryTaskIntersection;
+    validate('TryTask', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the TryTask.
+   * Creates a copy of the TryTask, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the TryTask instance.
+   */
+  normalize(): TryTask & Specification.TryTask {
+    const copy = new TryTask(this as any) as TryTaskIntersection;
+    return getLifecycleHooks('TryTask')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _TryTask = TryTask as TryTaskConstructor;
diff --git a/src/lib/generated/classes/uri-template.ts b/src/lib/generated/classes/uri-template.ts
new file mode 100644
index 00000000..4819ae13
--- /dev/null
+++ b/src/lib/generated/classes/uri-template.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the UriTemplate class and type
+ */
+export type UriTemplateIntersection = UriTemplate & Specification.UriTemplate;
+
+/**
+ * Represents a constructor for the intersection of the UriTemplate class and type
+ */
+export interface UriTemplateConstructor {
+  new (model?: Partial): UriTemplateIntersection;
+}
+
+/**
+ * Represents a UriTemplate with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class UriTemplate extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the UriTemplate class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the UriTemplate.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('UriTemplate')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the UriTemplate.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new UriTemplate(this as any) as UriTemplateIntersection;
+    validate('UriTemplate', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the UriTemplate.
+   * Creates a copy of the UriTemplate, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the UriTemplate instance.
+   */
+  normalize(): UriTemplate & Specification.UriTemplate {
+    const copy = new UriTemplate(this as any) as UriTemplateIntersection;
+    return getLifecycleHooks('UriTemplate')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _UriTemplate = UriTemplate as UriTemplateConstructor;
diff --git a/src/lib/generated/classes/use-authentications.ts b/src/lib/generated/classes/use-authentications.ts
new file mode 100644
index 00000000..b5a4a855
--- /dev/null
+++ b/src/lib/generated/classes/use-authentications.ts
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _AuthenticationPolicy } from './authentication-policy';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the UseAuthentications class and type
+ */
+export type UseAuthenticationsIntersection = UseAuthentications & Specification.UseAuthentications;
+
+/**
+ * Represents a constructor for the intersection of the UseAuthentications class and type
+ */
+export interface UseAuthenticationsConstructor {
+  new (model?: Partial): UseAuthenticationsIntersection;
+}
+
+/**
+ * Represents a UseAuthentications with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class UseAuthentications extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the UseAuthentications class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the UseAuthentications.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.UseAuthentications & object;
+    if (isObject(model)) {
+      const knownProperties: string[] = [];
+      Object.entries(model)
+        .filter(([key]) => !knownProperties.includes(key))
+        .forEach(([key, value]) => {
+          self[key] = new _AuthenticationPolicy(value);
+        });
+    }
+    getLifecycleHooks('UseAuthentications')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the UseAuthentications.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new UseAuthentications(this as any) as UseAuthenticationsIntersection;
+    validate('UseAuthentications', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the UseAuthentications.
+   * Creates a copy of the UseAuthentications, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the UseAuthentications instance.
+   */
+  normalize(): UseAuthentications & Specification.UseAuthentications {
+    const copy = new UseAuthentications(this as any) as UseAuthenticationsIntersection;
+    return getLifecycleHooks('UseAuthentications')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _UseAuthentications = UseAuthentications as UseAuthenticationsConstructor;
diff --git a/src/lib/generated/classes/use-catalogs.ts b/src/lib/generated/classes/use-catalogs.ts
new file mode 100644
index 00000000..47fe2bc6
--- /dev/null
+++ b/src/lib/generated/classes/use-catalogs.ts
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Catalog } from './catalog';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the UseCatalogs class and type
+ */
+export type UseCatalogsIntersection = UseCatalogs & Specification.UseCatalogs;
+
+/**
+ * Represents a constructor for the intersection of the UseCatalogs class and type
+ */
+export interface UseCatalogsConstructor {
+  new (model?: Partial): UseCatalogsIntersection;
+}
+
+/**
+ * Represents a UseCatalogs with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class UseCatalogs extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the UseCatalogs class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the UseCatalogs.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.UseCatalogs & object;
+    if (isObject(model)) {
+      const knownProperties: string[] = [];
+      Object.entries(model)
+        .filter(([key]) => !knownProperties.includes(key))
+        .forEach(([key, value]) => {
+          self[key] = new _Catalog(value);
+        });
+    }
+    getLifecycleHooks('UseCatalogs')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the UseCatalogs.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new UseCatalogs(this as any) as UseCatalogsIntersection;
+    validate('UseCatalogs', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the UseCatalogs.
+   * Creates a copy of the UseCatalogs, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the UseCatalogs instance.
+   */
+  normalize(): UseCatalogs & Specification.UseCatalogs {
+    const copy = new UseCatalogs(this as any) as UseCatalogsIntersection;
+    return getLifecycleHooks('UseCatalogs')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _UseCatalogs = UseCatalogs as UseCatalogsConstructor;
diff --git a/src/lib/generated/classes/use-errors.ts b/src/lib/generated/classes/use-errors.ts
new file mode 100644
index 00000000..94a57176
--- /dev/null
+++ b/src/lib/generated/classes/use-errors.ts
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Error } from './error';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the UseErrors class and type
+ */
+export type UseErrorsIntersection = UseErrors & Specification.UseErrors;
+
+/**
+ * Represents a constructor for the intersection of the UseErrors class and type
+ */
+export interface UseErrorsConstructor {
+  new (model?: Partial): UseErrorsIntersection;
+}
+
+/**
+ * Represents a UseErrors with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class UseErrors extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the UseErrors class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the UseErrors.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.UseErrors & object;
+    if (isObject(model)) {
+      const knownProperties: string[] = [];
+      Object.entries(model)
+        .filter(([key]) => !knownProperties.includes(key))
+        .forEach(([key, value]) => {
+          self[key] = new _Error(value);
+        });
+    }
+    getLifecycleHooks('UseErrors')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the UseErrors.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new UseErrors(this as any) as UseErrorsIntersection;
+    validate('UseErrors', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the UseErrors.
+   * Creates a copy of the UseErrors, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the UseErrors instance.
+   */
+  normalize(): UseErrors & Specification.UseErrors {
+    const copy = new UseErrors(this as any) as UseErrorsIntersection;
+    return getLifecycleHooks('UseErrors')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _UseErrors = UseErrors as UseErrorsConstructor;
diff --git a/src/lib/generated/classes/use-extensions.ts b/src/lib/generated/classes/use-extensions.ts
new file mode 100644
index 00000000..3fcf01bb
--- /dev/null
+++ b/src/lib/generated/classes/use-extensions.ts
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _ExtensionItem } from './extension-item';
+import { Specification } from '../definitions';
+import { ArrayHydrator } from '../../hydrator';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the UseExtensions class and type
+ */
+export type UseExtensionsIntersection = UseExtensions & Specification.UseExtensions;
+
+/**
+ * Represents a constructor for the intersection of the UseExtensions class and type
+ */
+export interface UseExtensionsConstructor {
+  new (model?: Array | number): UseExtensionsIntersection;
+}
+
+/**
+ * Represents a collection of Specification.ExtensionItem.
+ * Inherits from ArrayHydrator to handle array-specific hydration.
+ */
+export class UseExtensions extends ArrayHydrator {
+  /**
+   * Constructs a new instance of the UseExtensions class.
+   *
+   * @param model - Optional parameter which can be an array of objects or a number representing the array length.
+   */
+  constructor(model?: Array | number) {
+    super(model);
+    if (Array.isArray(model)) {
+      if (model?.length) {
+        this.splice(0, this.length);
+        model.forEach((item) => this.push(new _ExtensionItem(item)));
+      }
+    }
+    Object.setPrototypeOf(this, Object.create(UseExtensions.prototype));
+    getLifecycleHooks('UseExtensions')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the UseExtensions.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new UseExtensions(this);
+    validate('UseExtensions', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the UseExtensions.
+   * Creates a copy of the UseExtensions, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the UseExtensions instance.
+   */
+  normalize(): UseExtensions {
+    const copy = new UseExtensions(this);
+    return getLifecycleHooks('UseExtensions')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _UseExtensions = UseExtensions as unknown as UseExtensionsConstructor;
+//export const _UseExtensions = UseExtensions; // could be exported directly, but it makes the job of building the index more straightforward as it's consistant with "object" classes
diff --git a/src/lib/generated/classes/use-functions.ts b/src/lib/generated/classes/use-functions.ts
new file mode 100644
index 00000000..2a26e866
--- /dev/null
+++ b/src/lib/generated/classes/use-functions.ts
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Task } from './task';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the UseFunctions class and type
+ */
+export type UseFunctionsIntersection = UseFunctions & Specification.UseFunctions;
+
+/**
+ * Represents a constructor for the intersection of the UseFunctions class and type
+ */
+export interface UseFunctionsConstructor {
+  new (model?: Partial): UseFunctionsIntersection;
+}
+
+/**
+ * Represents a UseFunctions with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class UseFunctions extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the UseFunctions class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the UseFunctions.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.UseFunctions & object;
+    if (isObject(model)) {
+      const knownProperties: string[] = [];
+      Object.entries(model)
+        .filter(([key]) => !knownProperties.includes(key))
+        .forEach(([key, value]) => {
+          self[key] = new _Task(value);
+        });
+    }
+    getLifecycleHooks('UseFunctions')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the UseFunctions.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new UseFunctions(this as any) as UseFunctionsIntersection;
+    validate('UseFunctions', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the UseFunctions.
+   * Creates a copy of the UseFunctions, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the UseFunctions instance.
+   */
+  normalize(): UseFunctions & Specification.UseFunctions {
+    const copy = new UseFunctions(this as any) as UseFunctionsIntersection;
+    return getLifecycleHooks('UseFunctions')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _UseFunctions = UseFunctions as UseFunctionsConstructor;
diff --git a/src/lib/generated/classes/use-retries.ts b/src/lib/generated/classes/use-retries.ts
new file mode 100644
index 00000000..f75132f0
--- /dev/null
+++ b/src/lib/generated/classes/use-retries.ts
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _RetryPolicy } from './retry-policy';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the UseRetries class and type
+ */
+export type UseRetriesIntersection = UseRetries & Specification.UseRetries;
+
+/**
+ * Represents a constructor for the intersection of the UseRetries class and type
+ */
+export interface UseRetriesConstructor {
+  new (model?: Partial): UseRetriesIntersection;
+}
+
+/**
+ * Represents a UseRetries with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class UseRetries extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the UseRetries class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the UseRetries.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.UseRetries & object;
+    if (isObject(model)) {
+      const knownProperties: string[] = [];
+      Object.entries(model)
+        .filter(([key]) => !knownProperties.includes(key))
+        .forEach(([key, value]) => {
+          self[key] = new _RetryPolicy(value);
+        });
+    }
+    getLifecycleHooks('UseRetries')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the UseRetries.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new UseRetries(this as any) as UseRetriesIntersection;
+    validate('UseRetries', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the UseRetries.
+   * Creates a copy of the UseRetries, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the UseRetries instance.
+   */
+  normalize(): UseRetries & Specification.UseRetries {
+    const copy = new UseRetries(this as any) as UseRetriesIntersection;
+    return getLifecycleHooks('UseRetries')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _UseRetries = UseRetries as UseRetriesConstructor;
diff --git a/src/lib/generated/classes/use-secrets.ts b/src/lib/generated/classes/use-secrets.ts
new file mode 100644
index 00000000..c49c15a1
--- /dev/null
+++ b/src/lib/generated/classes/use-secrets.ts
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { Specification } from '../definitions';
+import { ArrayHydrator } from '../../hydrator';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the UseSecrets class and type
+ */
+export type UseSecretsIntersection = UseSecrets & Specification.UseSecrets;
+
+/**
+ * Represents a constructor for the intersection of the UseSecrets class and type
+ */
+export interface UseSecretsConstructor {
+  new (model?: Array | number): UseSecretsIntersection;
+}
+
+/**
+ * Represents a collection of string.
+ * Inherits from ArrayHydrator to handle array-specific hydration.
+ */
+export class UseSecrets extends ArrayHydrator {
+  /**
+   * Constructs a new instance of the UseSecrets class.
+   *
+   * @param model - Optional parameter which can be an array of objects or a number representing the array length.
+   */
+  constructor(model?: Array | number) {
+    super(model);
+    if (Array.isArray(model)) {
+      if (model?.length) {
+        this.splice(0, this.length);
+        model.forEach((item) => this.push(item));
+      }
+    }
+    Object.setPrototypeOf(this, Object.create(UseSecrets.prototype));
+    getLifecycleHooks('UseSecrets')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the UseSecrets.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new UseSecrets(this);
+    validate('UseSecrets', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the UseSecrets.
+   * Creates a copy of the UseSecrets, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the UseSecrets instance.
+   */
+  normalize(): UseSecrets {
+    const copy = new UseSecrets(this);
+    return getLifecycleHooks('UseSecrets')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _UseSecrets = UseSecrets as unknown as UseSecretsConstructor;
+//export const _UseSecrets = UseSecrets; // could be exported directly, but it makes the job of building the index more straightforward as it's consistant with "object" classes
diff --git a/src/lib/generated/classes/use-timeouts.ts b/src/lib/generated/classes/use-timeouts.ts
new file mode 100644
index 00000000..2931bc8c
--- /dev/null
+++ b/src/lib/generated/classes/use-timeouts.ts
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Timeout } from './timeout';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the UseTimeouts class and type
+ */
+export type UseTimeoutsIntersection = UseTimeouts & Specification.UseTimeouts;
+
+/**
+ * Represents a constructor for the intersection of the UseTimeouts class and type
+ */
+export interface UseTimeoutsConstructor {
+  new (model?: Partial): UseTimeoutsIntersection;
+}
+
+/**
+ * Represents a UseTimeouts with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class UseTimeouts extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the UseTimeouts class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the UseTimeouts.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.UseTimeouts & object;
+    if (isObject(model)) {
+      const knownProperties: string[] = [];
+      Object.entries(model)
+        .filter(([key]) => !knownProperties.includes(key))
+        .forEach(([key, value]) => {
+          self[key] = new _Timeout(value);
+        });
+    }
+    getLifecycleHooks('UseTimeouts')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the UseTimeouts.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new UseTimeouts(this as any) as UseTimeoutsIntersection;
+    validate('UseTimeouts', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the UseTimeouts.
+   * Creates a copy of the UseTimeouts, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the UseTimeouts instance.
+   */
+  normalize(): UseTimeouts & Specification.UseTimeouts {
+    const copy = new UseTimeouts(this as any) as UseTimeoutsIntersection;
+    return getLifecycleHooks('UseTimeouts')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _UseTimeouts = UseTimeouts as UseTimeoutsConstructor;
diff --git a/src/lib/generated/classes/use.ts b/src/lib/generated/classes/use.ts
new file mode 100644
index 00000000..6af0c916
--- /dev/null
+++ b/src/lib/generated/classes/use.ts
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _UseAuthentications } from './use-authentications';
+import { _UseErrors } from './use-errors';
+import { _UseExtensions } from './use-extensions';
+import { _UseFunctions } from './use-functions';
+import { _UseRetries } from './use-retries';
+import { _UseTimeouts } from './use-timeouts';
+import { _UseCatalogs } from './use-catalogs';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the Use class and type
+ */
+export type UseIntersection = Use & Specification.Use;
+
+/**
+ * Represents a constructor for the intersection of the Use class and type
+ */
+export interface UseConstructor {
+  new (model?: Partial): UseIntersection;
+}
+
+/**
+ * Represents a Use with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class Use extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the Use class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the Use.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.Use & object;
+    if (isObject(model)) {
+      if (typeof model.authentications === 'object')
+        self.authentications = new _UseAuthentications(model.authentications);
+      if (typeof model.errors === 'object') self.errors = new _UseErrors(model.errors);
+      if (typeof model.extensions === 'object') self.extensions = new _UseExtensions(model.extensions);
+      if (typeof model.functions === 'object') self.functions = new _UseFunctions(model.functions);
+      if (typeof model.retries === 'object') self.retries = new _UseRetries(model.retries);
+      if (typeof model.timeouts === 'object') self.timeouts = new _UseTimeouts(model.timeouts);
+      if (typeof model.catalogs === 'object') self.catalogs = new _UseCatalogs(model.catalogs);
+    }
+    getLifecycleHooks('Use')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the Use.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new Use(this as any) as UseIntersection;
+    validate('Use', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the Use.
+   * Creates a copy of the Use, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the Use instance.
+   */
+  normalize(): Use & Specification.Use {
+    const copy = new Use(this as any) as UseIntersection;
+    return getLifecycleHooks('Use')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _Use = Use as UseConstructor;
diff --git a/src/lib/generated/classes/wait-task.ts b/src/lib/generated/classes/wait-task.ts
new file mode 100644
index 00000000..ed80c011
--- /dev/null
+++ b/src/lib/generated/classes/wait-task.ts
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Input } from './input';
+import { _Output } from './output';
+import { _Export } from './export';
+import { _TaskTimeout } from './task-timeout';
+import { _TaskMetadata } from './task-metadata';
+import { _Duration } from './duration';
+import { _TaskBase } from './task-base';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the WaitTask class and type
+ */
+export type WaitTaskIntersection = WaitTask & Specification.WaitTask;
+
+/**
+ * Represents a constructor for the intersection of the WaitTask class and type
+ */
+export interface WaitTaskConstructor {
+  new (model?: Partial): WaitTaskIntersection;
+}
+
+/**
+ * Represents a WaitTask with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class WaitTask extends _TaskBase {
+  /**
+   * Instanciates a new instance of the WaitTask class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the WaitTask.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.WaitTask & object;
+    if (isObject(model)) {
+      if (typeof model.input === 'object') self.input = new _Input(model.input);
+      if (typeof model.output === 'object') self.output = new _Output(model.output);
+      if (typeof model.export === 'object') self.export = new _Export(model.export);
+      if (typeof model.timeout === 'object') self.timeout = new _TaskTimeout(model.timeout);
+      if (typeof model.metadata === 'object') self.metadata = new _TaskMetadata(model.metadata);
+      if (typeof model.wait === 'object') self.wait = new _Duration(model.wait);
+    }
+    getLifecycleHooks('WaitTask')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the WaitTask.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new WaitTask(this as any) as WaitTaskIntersection;
+    validate('WaitTask', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the WaitTask.
+   * Creates a copy of the WaitTask, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the WaitTask instance.
+   */
+  normalize(): WaitTask & Specification.WaitTask {
+    const copy = new WaitTask(this as any) as WaitTaskIntersection;
+    return getLifecycleHooks('WaitTask')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _WaitTask = WaitTask as WaitTaskConstructor;
diff --git a/src/lib/generated/classes/with-event.ts b/src/lib/generated/classes/with-event.ts
new file mode 100644
index 00000000..defc4b88
--- /dev/null
+++ b/src/lib/generated/classes/with-event.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the WithEvent class and type
+ */
+export type WithEventIntersection = WithEvent & Specification.WithEvent;
+
+/**
+ * Represents a constructor for the intersection of the WithEvent class and type
+ */
+export interface WithEventConstructor {
+  new (model?: Partial): WithEventIntersection;
+}
+
+/**
+ * Represents a WithEvent with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class WithEvent extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the WithEvent class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the WithEvent.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('WithEvent')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the WithEvent.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new WithEvent(this as any) as WithEventIntersection;
+    validate('WithEvent', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the WithEvent.
+   * Creates a copy of the WithEvent, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the WithEvent instance.
+   */
+  normalize(): WithEvent & Specification.WithEvent {
+    const copy = new WithEvent(this as any) as WithEventIntersection;
+    return getLifecycleHooks('WithEvent')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _WithEvent = WithEvent as WithEventConstructor;
diff --git a/src/lib/generated/classes/with-grpc-arguments.ts b/src/lib/generated/classes/with-grpc-arguments.ts
new file mode 100644
index 00000000..69644203
--- /dev/null
+++ b/src/lib/generated/classes/with-grpc-arguments.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the WithGRPCArguments class and type
+ */
+export type WithGRPCArgumentsIntersection = WithGRPCArguments & Specification.WithGRPCArguments;
+
+/**
+ * Represents a constructor for the intersection of the WithGRPCArguments class and type
+ */
+export interface WithGRPCArgumentsConstructor {
+  new (model?: Partial): WithGRPCArgumentsIntersection;
+}
+
+/**
+ * Represents a WithGRPCArguments with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class WithGRPCArguments extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the WithGRPCArguments class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the WithGRPCArguments.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('WithGRPCArguments')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the WithGRPCArguments.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new WithGRPCArguments(this as any) as WithGRPCArgumentsIntersection;
+    validate('WithGRPCArguments', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the WithGRPCArguments.
+   * Creates a copy of the WithGRPCArguments, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the WithGRPCArguments instance.
+   */
+  normalize(): WithGRPCArguments & Specification.WithGRPCArguments {
+    const copy = new WithGRPCArguments(this as any) as WithGRPCArgumentsIntersection;
+    return getLifecycleHooks('WithGRPCArguments')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _WithGRPCArguments = WithGRPCArguments as WithGRPCArgumentsConstructor;
diff --git a/src/lib/generated/classes/with-grpc-service.ts b/src/lib/generated/classes/with-grpc-service.ts
new file mode 100644
index 00000000..3bdcd932
--- /dev/null
+++ b/src/lib/generated/classes/with-grpc-service.ts
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _ReferenceableAuthenticationPolicy } from './referenceable-authentication-policy';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the WithGRPCService class and type
+ */
+export type WithGRPCServiceIntersection = WithGRPCService & Specification.WithGRPCService;
+
+/**
+ * Represents a constructor for the intersection of the WithGRPCService class and type
+ */
+export interface WithGRPCServiceConstructor {
+  new (model?: Partial): WithGRPCServiceIntersection;
+}
+
+/**
+ * Represents a WithGRPCService with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class WithGRPCService extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the WithGRPCService class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the WithGRPCService.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.WithGRPCService & object;
+    if (isObject(model)) {
+      if (typeof model.authentication === 'object')
+        self.authentication = new _ReferenceableAuthenticationPolicy(model.authentication);
+    }
+    getLifecycleHooks('WithGRPCService')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the WithGRPCService.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new WithGRPCService(this as any) as WithGRPCServiceIntersection;
+    validate('WithGRPCService', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the WithGRPCService.
+   * Creates a copy of the WithGRPCService, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the WithGRPCService instance.
+   */
+  normalize(): WithGRPCService & Specification.WithGRPCService {
+    const copy = new WithGRPCService(this as any) as WithGRPCServiceIntersection;
+    return getLifecycleHooks('WithGRPCService')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _WithGRPCService = WithGRPCService as WithGRPCServiceConstructor;
diff --git a/src/lib/generated/classes/with-open-api-parameters.ts b/src/lib/generated/classes/with-open-api-parameters.ts
new file mode 100644
index 00000000..66b4ca0f
--- /dev/null
+++ b/src/lib/generated/classes/with-open-api-parameters.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the WithOpenAPIParameters class and type
+ */
+export type WithOpenAPIParametersIntersection = WithOpenAPIParameters & Specification.WithOpenAPIParameters;
+
+/**
+ * Represents a constructor for the intersection of the WithOpenAPIParameters class and type
+ */
+export interface WithOpenAPIParametersConstructor {
+  new (model?: Partial): WithOpenAPIParametersIntersection;
+}
+
+/**
+ * Represents a WithOpenAPIParameters with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class WithOpenAPIParameters extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the WithOpenAPIParameters class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the WithOpenAPIParameters.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('WithOpenAPIParameters')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the WithOpenAPIParameters.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new WithOpenAPIParameters(this as any) as WithOpenAPIParametersIntersection;
+    validate('WithOpenAPIParameters', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the WithOpenAPIParameters.
+   * Creates a copy of the WithOpenAPIParameters, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the WithOpenAPIParameters instance.
+   */
+  normalize(): WithOpenAPIParameters & Specification.WithOpenAPIParameters {
+    const copy = new WithOpenAPIParameters(this as any) as WithOpenAPIParametersIntersection;
+    return getLifecycleHooks('WithOpenAPIParameters')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _WithOpenAPIParameters = WithOpenAPIParameters as WithOpenAPIParametersConstructor;
diff --git a/src/lib/generated/classes/workflow-metadata.ts b/src/lib/generated/classes/workflow-metadata.ts
new file mode 100644
index 00000000..cc6ea302
--- /dev/null
+++ b/src/lib/generated/classes/workflow-metadata.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the WorkflowMetadata class and type
+ */
+export type WorkflowMetadataIntersection = WorkflowMetadata & Specification.WorkflowMetadata;
+
+/**
+ * Represents a constructor for the intersection of the WorkflowMetadata class and type
+ */
+export interface WorkflowMetadataConstructor {
+  new (model?: Partial): WorkflowMetadataIntersection;
+}
+
+/**
+ * Represents a WorkflowMetadata with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class WorkflowMetadata extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the WorkflowMetadata class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the WorkflowMetadata.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('WorkflowMetadata')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the WorkflowMetadata.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new WorkflowMetadata(this as any) as WorkflowMetadataIntersection;
+    validate('WorkflowMetadata', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the WorkflowMetadata.
+   * Creates a copy of the WorkflowMetadata, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the WorkflowMetadata instance.
+   */
+  normalize(): WorkflowMetadata & Specification.WorkflowMetadata {
+    const copy = new WorkflowMetadata(this as any) as WorkflowMetadataIntersection;
+    return getLifecycleHooks('WorkflowMetadata')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _WorkflowMetadata = WorkflowMetadata as WorkflowMetadataConstructor;
diff --git a/src/lib/generated/classes/workflow-tags.ts b/src/lib/generated/classes/workflow-tags.ts
new file mode 100644
index 00000000..8412c3e2
--- /dev/null
+++ b/src/lib/generated/classes/workflow-tags.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+
+/**
+ * Represents the intersection between the WorkflowTags class and type
+ */
+export type WorkflowTagsIntersection = WorkflowTags & Specification.WorkflowTags;
+
+/**
+ * Represents a constructor for the intersection of the WorkflowTags class and type
+ */
+export interface WorkflowTagsConstructor {
+  new (model?: Partial): WorkflowTagsIntersection;
+}
+
+/**
+ * Represents a WorkflowTags with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class WorkflowTags extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the WorkflowTags class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the WorkflowTags.
+   */
+  constructor(model?: Partial) {
+    super(model);
+
+    getLifecycleHooks('WorkflowTags')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the WorkflowTags.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new WorkflowTags(this as any) as WorkflowTagsIntersection;
+    validate('WorkflowTags', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the WorkflowTags.
+   * Creates a copy of the WorkflowTags, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the WorkflowTags instance.
+   */
+  normalize(): WorkflowTags & Specification.WorkflowTags {
+    const copy = new WorkflowTags(this as any) as WorkflowTagsIntersection;
+    return getLifecycleHooks('WorkflowTags')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _WorkflowTags = WorkflowTags as WorkflowTagsConstructor;
diff --git a/src/lib/generated/classes/workflow-timeout.ts b/src/lib/generated/classes/workflow-timeout.ts
new file mode 100644
index 00000000..12809085
--- /dev/null
+++ b/src/lib/generated/classes/workflow-timeout.ts
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Duration } from './duration';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+
+/**
+ * Represents the intersection between the WorkflowTimeout class and type
+ */
+export type WorkflowTimeoutIntersection = WorkflowTimeout & Specification.WorkflowTimeout;
+
+/**
+ * Represents a constructor for the intersection of the WorkflowTimeout class and type
+ */
+export interface WorkflowTimeoutConstructor {
+  new (model?: Partial): WorkflowTimeoutIntersection;
+}
+
+/**
+ * Represents a WorkflowTimeout with methods for validation and normalization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class WorkflowTimeout extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the WorkflowTimeout class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the WorkflowTimeout.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.WorkflowTimeout & object;
+    if (isObject(model)) {
+      if (typeof (model as Specification.Timeout).after === 'object')
+        (self as Specification.Timeout).after = new _Duration(
+          (model as Specification.Timeout).after as Specification.Duration,
+        );
+    }
+    getLifecycleHooks('WorkflowTimeout')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the WorkflowTimeout.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new WorkflowTimeout(this as any) as WorkflowTimeoutIntersection;
+    validate('WorkflowTimeout', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the WorkflowTimeout.
+   * Creates a copy of the WorkflowTimeout, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the WorkflowTimeout instance.
+   */
+  normalize(): WorkflowTimeout & Specification.WorkflowTimeout {
+    const copy = new WorkflowTimeout(this as any) as WorkflowTimeoutIntersection;
+    return getLifecycleHooks('WorkflowTimeout')?.normalize?.(copy) || copy;
+  }
+}
+
+export const _WorkflowTimeout = WorkflowTimeout as WorkflowTimeoutConstructor;
diff --git a/src/lib/generated/classes/workflow.ts b/src/lib/generated/classes/workflow.ts
new file mode 100644
index 00000000..e7308cca
--- /dev/null
+++ b/src/lib/generated/classes/workflow.ts
@@ -0,0 +1,182 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+import { _Document } from './document';
+import { _Input } from './input';
+import { _Use } from './use';
+import { _TaskList } from './task-list';
+import { _WorkflowTimeout } from './workflow-timeout';
+import { _Output } from './output';
+import { _Schedule } from './schedule';
+import { ObjectHydrator } from '../../hydrator';
+import { Specification } from '../definitions';
+import { getLifecycleHooks } from '../../lifecycle-hooks';
+import { validate } from '../../validation';
+import { isObject } from '../../utils';
+import * as yaml from 'js-yaml';
+import { buildGraph, Graph } from '../../graph-builder';
+import { convertToMermaidCode } from '../../mermaid-converter';
+
+/**
+ * Represents the intersection between the Workflow class and type
+ */
+export type WorkflowIntersection = Workflow & Specification.Workflow;
+
+/**
+ * Represents a constructor for the intersection of the Workflow class and type
+ */
+export interface WorkflowConstructor {
+  new (model?: Partial): WorkflowIntersection;
+}
+
+/**
+ * Represents a Workflow with methods for validation normalization, and serialization.
+ * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model.
+ */
+export class Workflow extends ObjectHydrator {
+  /**
+   * Instanciates a new instance of the Workflow class.
+   * Initializes properties based on the provided model if it is an object.
+   *
+   * @param model - Optional partial model object to initialize the Workflow.
+   */
+  constructor(model?: Partial) {
+    super(model);
+    const self = this as unknown as Specification.Workflow & object;
+    if (isObject(model)) {
+      if (typeof model.document === 'object') self.document = new _Document(model.document);
+      if (typeof model.input === 'object') self.input = new _Input(model.input);
+      if (typeof model.use === 'object') self.use = new _Use(model.use);
+      if (typeof model.do === 'object') self.do = new _TaskList(model.do);
+      if (typeof model.timeout === 'object') self.timeout = new _WorkflowTimeout(model.timeout);
+      if (typeof model.output === 'object') self.output = new _Output(model.output);
+      if (typeof model.schedule === 'object') self.schedule = new _Schedule(model.schedule);
+    }
+    getLifecycleHooks('Workflow')?.constructor?.(this);
+  }
+
+  /**
+   * Validates the current instance of the Workflow.
+   * Throws if invalid.
+   */
+  validate(workflow?: Partial) {
+    const copy = new Workflow(this as any) as WorkflowIntersection;
+    validate('Workflow', copy, workflow);
+  }
+
+  /**
+   * Normalizes the current instance of the Workflow.
+   * Creates a copy of the Workflow, invokes normalization hooks if available, and returns the normalized copy.
+   *
+   * @returns A normalized version of the Workflow instance.
+   */
+  normalize(): Workflow & Specification.Workflow {
+    const copy = new Workflow(this as any) as WorkflowIntersection;
+    return getLifecycleHooks('Workflow')?.normalize?.(copy) || copy;
+  }
+
+  static deserialize(text: string): WorkflowIntersection {
+    const model = yaml.load(text) as Partial;
+    validate('Workflow', model);
+    return new Workflow(model) as WorkflowIntersection;
+  }
+
+  static serialize(
+    model: Partial,
+    format: 'yaml' | 'json' = 'yaml',
+    normalize: boolean = true,
+  ): string {
+    const workflow = new Workflow(model);
+    workflow.validate();
+    const normalized = normalize ? workflow.normalize() : workflow;
+    if (format === 'json') {
+      return JSON.stringify(normalized);
+    }
+    return yaml.dump(normalized);
+  }
+
+  static toGraph(model: Partial): Graph {
+    return buildGraph(model as unknown as WorkflowIntersection);
+  }
+
+  static toMermaidCode(model: Partial): string {
+    return convertToMermaidCode(model as unknown as WorkflowIntersection);
+  }
+
+  /**
+   * Serializes the workflow to YAML or JSON
+   * @param format The format, 'yaml' or 'json', default is 'yaml'
+   * @param normalize If the workflow should be normalized before serialization, default true
+   * @returns A string representation of the workflow
+   */
+  serialize(format: 'yaml' | 'json' = 'yaml', normalize: boolean = true): string {
+    return Workflow.serialize(this as unknown as WorkflowIntersection, format, normalize);
+  }
+
+  /**
+   * Creates a directed graph representation of the workflow
+   * @returns A directed graph of the workflow
+   */
+  toGraph(): Graph {
+    return Workflow.toGraph(this as unknown as WorkflowIntersection);
+  }
+
+  /**
+   * Generates the MermaidJS code corresponding to the workflow
+   * @returns The MermaidJS code
+   */
+  toMermaidCode(): string {
+    return Workflow.toMermaidCode(this as unknown as WorkflowIntersection);
+  }
+}
+
+export const _Workflow = Workflow as WorkflowConstructor & {
+  /**
+   * Deserializes the provided string as a Workflow
+   * @param text The YAML or JSON representation of a workflow
+   * @returns A new Workflow instance
+   */
+  deserialize(text: string): WorkflowIntersection;
+
+  /**
+   * Serializes the provided Workflow to YAML or JSON
+   * @param workflow The workflow to serialize
+   * @param format The format, 'yaml' or 'json', default is 'yaml'
+   * @param normalize If the workflow should be normalized before serialization, default true
+   * @returns A string representation of the workflow
+   */
+  serialize(workflow: Partial, format?: 'yaml' | 'json', normalize?: boolean): string;
+
+  /**
+   * Creates a directed graph representation of the provided workflow
+   * @param workflow The workflow to convert
+   * @returns A directed graph of the provided workflow
+   */
+  toGraph(workflow: Partial): Graph;
+
+  /**
+   * Generates the MermaidJS code corresponding to the provided workflow
+   * @param workflow The workflow to convert
+   * @returns The MermaidJS code
+   */
+  toMermaidCode(workflow: Partial): string;
+};
diff --git a/src/lib/schema/types/README.md b/src/lib/generated/definitions/README.md
similarity index 100%
rename from src/lib/schema/types/README.md
rename to src/lib/generated/definitions/README.md
diff --git a/src/lib/definitions/index.ts b/src/lib/generated/definitions/index.ts
similarity index 99%
rename from src/lib/definitions/index.ts
rename to src/lib/generated/definitions/index.ts
index eae5388a..ed0f6e75 100644
--- a/src/lib/definitions/index.ts
+++ b/src/lib/generated/definitions/index.ts
@@ -13,4 +13,5 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 export * as Specification from './specification';
diff --git a/src/lib/generated/definitions/specification.ts b/src/lib/generated/definitions/specification.ts
new file mode 100644
index 00000000..bd7407a9
--- /dev/null
+++ b/src/lib/generated/definitions/specification.ts
@@ -0,0 +1,1389 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+/**
+ * Represents the definition of a schema.
+ */
+export type Schema = SchemaInline | SchemaExternal;
+/**
+ * Represents an endpoint.
+ */
+export type Endpoint = RuntimeExpression | UriTemplate | EndpointConfiguration;
+/**
+ * A runtime expression.
+ */
+export type RuntimeExpression = string;
+export type UriTemplate = string;
+/**
+ * The endpoint's URI.
+ */
+export type EndpointUri = UriTemplate | RuntimeExpression;
+/**
+ * Represents a referenceable authentication policy.
+ */
+export type ReferenceableAuthenticationPolicy = AuthenticationPolicyReference | AuthenticationPolicy;
+/**
+ * Defines an authentication policy.
+ */
+export type AuthenticationPolicy =
+  | BasicAuthenticationPolicy
+  | BearerAuthenticationPolicy
+  | DigestAuthenticationPolicy
+  | OAuth2AuthenticationPolicy
+  | OpenIdConnectAuthenticationPolicy;
+/**
+ * The configuration of the basic authentication policy.
+ */
+export type BasicAuthenticationPolicyConfiguration = BasicAuthenticationProperties | SecretBasedAuthenticationPolicy;
+/**
+ * The configuration of the bearer authentication policy.
+ */
+export type BearerAuthenticationPolicyConfiguration = BearerAuthenticationProperties | SecretBasedAuthenticationPolicy;
+/**
+ * The configuration of the digest authentication policy.
+ */
+export type DigestAuthenticationPolicyConfiguration = DigestAuthenticationProperties | SecretBasedAuthenticationPolicy;
+/**
+ * The configuration of the OAuth2 authentication policy.
+ */
+export type OAuth2AuthenticationPolicyConfiguration =
+  | OAuth2ConnectAuthenticationProperties
+  | SecretBasedAuthenticationPolicy;
+/**
+ * The inline configuration of the OAuth2 authentication policy.
+ */
+export type OAuth2ConnectAuthenticationProperties = OAuth2AutenthicationData & {
+  endpoints?: OAuth2AuthenticationPropertiesEndpoints;
+  [k: string]: unknown;
+};
+/**
+ * A list that contains that contains valid issuers that will be used to check against the issuer of generated tokens.
+ */
+export type OAuth2Issuers = string[];
+/**
+ * The scopes, if any, to request the token for.
+ */
+export type OAuth2AutenthicationDataScopes = string[];
+/**
+ * The audiences, if any, to request the token for.
+ */
+export type OAuth2AutenthicationDataAudiences = string[];
+/**
+ * The configuration of the OpenIdConnect authentication policy.
+ */
+export type OpenIdConnectAuthenticationPolicyConfiguration =
+  | OpenIdConnectAuthenticationProperties
+  | SecretBasedAuthenticationPolicy;
+/**
+ * A runtime expression, if any, used to mutate and/or filter the input of the workflow or task.
+ */
+export type InputFrom =
+  | string
+  | {
+      [k: string]: unknown;
+    };
+/**
+ * A URI reference that identifies the error type.
+ */
+export type ErrorType = UriTemplate | RuntimeExpression;
+/**
+ * A JSON Pointer used to reference the component the error originates from.
+ */
+export type ErrorInstance = RuntimeExpression;
+/**
+ * A discrete unit of work that contributes to achieving the overall objectives defined by the workflow.
+ */
+export type Task =
+  | CallTask
+  | DoTask
+  | ForkTask
+  | EmitTask
+  | ForTask
+  | ListenTask
+  | RaiseTask
+  | RunTask
+  | SetTask
+  | SwitchTask
+  | TryTask
+  | WaitTask;
+/**
+ * Defines the call to perform.
+ */
+export type CallTask = CallAsyncAPI | CallGRPC | CallHTTP | CallOpenAPI | CallFunction;
+/**
+ * Defines the AsyncAPI call to perform.
+ */
+export type CallAsyncAPI = TaskBase & {
+  call?: 'asyncapi';
+  with?: AsyncApiArguments;
+  [k: string]: unknown;
+};
+/**
+ * A runtime expression, if any, used to determine whether or not the task should be run.
+ */
+export type TaskBaseIf = string;
+/**
+ * A runtime expression, if any, used to mutate and/or filter the output of the workflow or task.
+ */
+export type OutputAs =
+  | string
+  | {
+      [k: string]: unknown;
+    };
+/**
+ * A runtime expression, if any, used to export the output data to the context.
+ */
+export type ExportAs =
+  | string
+  | {
+      [k: string]: unknown;
+    };
+export type TaskTimeout = Timeout | string;
+export type Duration = DurationInline | string;
+/**
+ * Represents different transition options for a workflow.
+ */
+export type FlowDirective = ('continue' | 'exit' | 'end') | string;
+/**
+ * The Async API call arguments.
+ */
+export type AsyncApiArguments = {
+  [k: string]: unknown;
+};
+/**
+ * Defines the GRPC call to perform.
+ */
+export type CallGRPC = TaskBase & {
+  call?: 'grpc';
+  with?: GRPCArguments;
+  [k: string]: unknown;
+};
+/**
+ * Defines the HTTP call to perform.
+ */
+export type CallHTTP = TaskBase & {
+  call?: 'http';
+  with?: HTTPArguments;
+  [k: string]: unknown;
+};
+/**
+ * Defines the OpenAPI call to perform.
+ */
+export type CallOpenAPI = TaskBase & {
+  call?: 'openapi';
+  with?: OpenAPIArguments;
+  [k: string]: unknown;
+};
+/**
+ * Defines the function call to perform.
+ */
+export type CallFunction = TaskBase & {
+  /**
+   * The name of the function to call.
+   */
+  call?: string;
+  with?: FunctionArguments;
+  [k: string]: unknown;
+};
+/**
+ * Allows to execute a list of tasks in sequence.
+ */
+export type DoTask = TaskBase & {
+  do?: TaskList;
+  [k: string]: unknown;
+};
+/**
+ * Allows workflows to execute multiple tasks concurrently and optionally race them against each other, with a single possible winner, which sets the task's output.
+ */
+export type ForkTask = TaskBase & {
+  fork?: ForkTaskConfiguration;
+  [k: string]: unknown;
+};
+/**
+ * Allows workflows to publish events to event brokers or messaging systems, facilitating communication and coordination between different components and services.
+ */
+export type EmitTask = TaskBase & {
+  emit?: EmitTaskConfiguration;
+  [k: string]: unknown;
+};
+/**
+ * Identifies the context in which an event happened.
+ */
+export type EventSource = UriTemplate | RuntimeExpression;
+/**
+ * When the event occured.
+ */
+export type EventTime = RuntimeExpression;
+/**
+ * The schema describing the event format.
+ */
+export type EventDataschema = UriTemplate | RuntimeExpression;
+/**
+ * The event's payload data
+ */
+export type EventData =
+  | RuntimeExpression
+  | {
+      [k: string]: unknown;
+    };
+/**
+ * Allows workflows to iterate over a collection of items, executing a defined set of subtasks for each item in the collection. This task type is instrumental in handling scenarios such as batch processing, data transformation, and repetitive operations across datasets.
+ */
+export type ForTask = TaskBase & {
+  for?: ForTaskConfiguration;
+  /**
+   * A runtime expression that represents the condition, if any, that must be met for the iteration to continue.
+   */
+  while?: string;
+  do?: TaskList;
+  [k: string]: unknown;
+};
+/**
+ * Provides a mechanism for workflows to await and react to external events, enabling event-driven behavior within workflow systems.
+ */
+export type ListenTask = TaskBase & {
+  listen?: ListenTaskConfiguration;
+  foreach?: SubscriptionIterator;
+  [k: string]: unknown;
+};
+/**
+ * Describe the event consumption strategy to adopt.
+ */
+export type EventConsumptionStrategy =
+  | AllEventConsumptionStrategy
+  | AnyEventConsumptionStrategy
+  | OneEventConsumptionStrategy;
+/**
+ * A list containing all the events that must be consumed.
+ */
+export type AllEventConsumptionStrategyConfiguration = EventFilter[];
+/**
+ * A list containing any of the events to consume.
+ */
+export type AnyEventConsumptionStrategyConfiguration = EventFilter[];
+export type AnyEventConsumptionStrategyUntil = string | AnyEventUntilConsumed;
+export type AnyEventUntilConsumed = EventConsumptionStrategy & {
+  until?: never;
+  [k: string]: unknown;
+};
+/**
+ * Intentionally triggers and propagates errors.
+ */
+export type RaiseTask = TaskBase & {
+  raise?: RaiseTaskConfiguration;
+  [k: string]: unknown;
+};
+export type RaiseTaskError = Error | string;
+/**
+ * Provides the capability to execute external containers, shell commands, scripts, or workflows.
+ */
+export type RunTask = TaskBase & {
+  run?: RunTaskConfiguration;
+  [k: string]: unknown;
+};
+/**
+ * The configuration of the process to execute.
+ */
+export type RunTaskConfiguration = RunContainer | RunScript | RunShell | RunWorkflow;
+/**
+ * The configuration of the script to run.
+ */
+export type Script = InlineScript | ExternalScript;
+/**
+ * A task used to set data.
+ */
+export type SetTask = TaskBase & {
+  set?: SetTaskConfiguration;
+  [k: string]: unknown;
+};
+/**
+ * Enables conditional branching within workflows, allowing them to dynamically select different paths based on specified conditions or criteria.
+ */
+export type SwitchTask = TaskBase & {
+  switch?: SwitchTaskConfiguration;
+  [k: string]: unknown;
+};
+/**
+ * The definition of the switch to use.
+ *
+ * @minItems 1
+ */
+export type SwitchTaskConfiguration = [SwitchItem, ...SwitchItem[]];
+/**
+ * Serves as a mechanism within workflows to handle errors gracefully, potentially retrying failed tasks before proceeding with alternate ones.
+ */
+export type TryTask = TaskBase & {
+  try?: TaskList;
+  catch?: TryTaskCatch;
+  [k: string]: unknown;
+};
+export type TryTaskCatchRetry = RetryPolicy | string;
+/**
+ * The retry duration backoff.
+ */
+export type RetryBackoff = ConstantBackoff | ExponentialBackOff | LinearBackoff;
+/**
+ * Allows workflows to pause or delay their execution for a specified period of time.
+ */
+export type WaitTask = TaskBase & {
+  wait?: Duration;
+  [k: string]: unknown;
+};
+/**
+ * List of named tasks to perform.
+ */
+export type TaskList = TaskItem[];
+/**
+ * The workflow's extensions.
+ */
+export type UseExtensions = ExtensionItem[];
+/**
+ * The workflow's reusable secrets.
+ */
+export type UseSecrets = string[];
+export type WorkflowTimeout = Timeout | string;
+
+/**
+ * Serverless Workflow DSL - Workflow Schema.
+ */
+export interface Workflow {
+  document: Document;
+  input?: Input;
+  use?: Use;
+  do: TaskList;
+  timeout?: WorkflowTimeout;
+  output?: Output;
+  schedule?: Schedule;
+  [k: string]: unknown;
+}
+/**
+ * Documents the workflow.
+ */
+export interface Document {
+  /**
+   * The version of the DSL used by the workflow.
+   */
+  dsl: string;
+  /**
+   * The workflow's namespace.
+   */
+  namespace: string;
+  /**
+   * The workflow's name.
+   */
+  name: string;
+  /**
+   * The workflow's semantic version.
+   */
+  version: string;
+  /**
+   * The workflow's title.
+   */
+  title?: string;
+  /**
+   * The workflow's Markdown summary.
+   */
+  summary?: string;
+  tags?: WorkflowTags;
+  metadata?: WorkflowMetadata;
+}
+/**
+ * A key/value mapping of the workflow's tags, if any.
+ */
+export interface WorkflowTags {
+  [k: string]: unknown;
+}
+/**
+ * Holds additional information about the workflow.
+ */
+export interface WorkflowMetadata {
+  [k: string]: unknown;
+}
+/**
+ * Configures the input of a workflow or task.
+ */
+export interface Input {
+  schema?: Schema;
+  from?: InputFrom;
+}
+export interface SchemaInline {
+  /**
+   * The schema's inline definition.
+   */
+  document: {
+    [k: string]: unknown;
+  };
+  [k: string]: unknown;
+}
+export interface SchemaExternal {
+  resource: ExternalResource;
+  [k: string]: unknown;
+}
+/**
+ * Represents an external resource.
+ */
+export interface ExternalResource {
+  /**
+   * The name of the external resource, if any.
+   */
+  name?: string;
+  endpoint: Endpoint;
+}
+export interface EndpointConfiguration {
+  uri: EndpointUri;
+  authentication?: ReferenceableAuthenticationPolicy;
+}
+/**
+ * The reference of the authentication policy to use.
+ */
+export interface AuthenticationPolicyReference {
+  /**
+   * The name of the authentication policy to use.
+   */
+  use: string;
+  [k: string]: unknown;
+}
+/**
+ * Use basic authentication.
+ */
+export interface BasicAuthenticationPolicy {
+  basic: BasicAuthenticationPolicyConfiguration;
+  [k: string]: unknown;
+}
+/**
+ * Inline configuration of the basic authentication policy.
+ */
+export interface BasicAuthenticationProperties {
+  /**
+   * The username to use.
+   */
+  username: string;
+  /**
+   * The password to use.
+   */
+  password: string;
+  [k: string]: unknown;
+}
+/**
+ * Represents an authentication policy based on secrets.
+ */
+export interface SecretBasedAuthenticationPolicy {
+  /**
+   * The name of the authentication policy to use.
+   */
+  use: string;
+}
+/**
+ * Use bearer authentication.
+ */
+export interface BearerAuthenticationPolicy {
+  bearer: BearerAuthenticationPolicyConfiguration;
+  [k: string]: unknown;
+}
+/**
+ * Inline configuration of the bearer authentication policy.
+ */
+export interface BearerAuthenticationProperties {
+  /**
+   * The bearer token to use.
+   */
+  token: string;
+  [k: string]: unknown;
+}
+/**
+ * Use digest authentication.
+ */
+export interface DigestAuthenticationPolicy {
+  digest: DigestAuthenticationPolicyConfiguration;
+  [k: string]: unknown;
+}
+/**
+ * Inline configuration of the digest authentication policy.
+ */
+export interface DigestAuthenticationProperties {
+  /**
+   * The username to use.
+   */
+  username: string;
+  /**
+   * The password to use.
+   */
+  password: string;
+  [k: string]: unknown;
+}
+/**
+ * Use OAuth2 authentication.
+ */
+export interface OAuth2AuthenticationPolicy {
+  oauth2: OAuth2AuthenticationPolicyConfiguration;
+  [k: string]: unknown;
+}
+/**
+ * Inline configuration of the OAuth2 authentication policy.
+ */
+export interface OAuth2AutenthicationData {
+  authority?: UriTemplate;
+  /**
+   * The grant type to use.
+   */
+  grant?:
+    | 'authorization_code'
+    | 'client_credentials'
+    | 'password'
+    | 'refresh_token'
+    | 'urn:ietf:params:oauth:grant-type:token-exchange';
+  client?: OAuth2AutenthicationDataClient;
+  request?: OAuth2TokenRequest;
+  issuers?: OAuth2Issuers;
+  scopes?: OAuth2AutenthicationDataScopes;
+  audiences?: OAuth2AutenthicationDataAudiences;
+  /**
+   * The username to use. Used only if the grant type is Password.
+   */
+  username?: string;
+  /**
+   * The password to use. Used only if the grant type is Password.
+   */
+  password?: string;
+  subject?: OAuth2TokenDefinition;
+  actor?: OAuth2TokenDefinition;
+  [k: string]: unknown;
+}
+/**
+ * The definition of an OAuth2 client.
+ */
+export interface OAuth2AutenthicationDataClient {
+  /**
+   * The client id to use.
+   */
+  id?: string;
+  /**
+   * The client secret to use, if any.
+   */
+  secret?: string;
+  /**
+   * A JWT containing a signed assertion with your application credentials.
+   */
+  assertion?: string;
+  /**
+   * The authentication method to use to authenticate the client.
+   */
+  authentication?: 'client_secret_basic' | 'client_secret_post' | 'client_secret_jwt' | 'private_key_jwt' | 'none';
+}
+/**
+ * The configuration of an OAuth2 token request
+ */
+export interface OAuth2TokenRequest {
+  encoding?: 'application/x-www-form-urlencoded' | 'application/json';
+  [k: string]: unknown;
+}
+/**
+ * Represents an OAuth2 token.
+ */
+export interface OAuth2TokenDefinition {
+  /**
+   * The security token to use.
+   */
+  token: string;
+  /**
+   * The type of the security token to use.
+   */
+  type: string;
+}
+/**
+ * The endpoint configurations for OAuth2.
+ */
+export interface OAuth2AuthenticationPropertiesEndpoints {
+  /**
+   * The relative path to the token endpoint. Defaults to `/oauth2/token`.
+   */
+  token?: string;
+  /**
+   * The relative path to the revocation endpoint. Defaults to `/oauth2/revoke`.
+   */
+  revocation?: string;
+  /**
+   * The relative path to the introspection endpoint. Defaults to `/oauth2/introspect`.
+   */
+  introspection?: string;
+  [k: string]: unknown;
+}
+/**
+ * Use OpenIdConnect authentication.
+ */
+export interface OpenIdConnectAuthenticationPolicy {
+  oidc: OpenIdConnectAuthenticationPolicyConfiguration;
+  [k: string]: unknown;
+}
+/**
+ * Inline configuration of the OAuth2 authentication policy.
+ */
+export interface OpenIdConnectAuthenticationProperties {
+  authority?: UriTemplate;
+  /**
+   * The grant type to use.
+   */
+  grant?:
+    | 'authorization_code'
+    | 'client_credentials'
+    | 'password'
+    | 'refresh_token'
+    | 'urn:ietf:params:oauth:grant-type:token-exchange';
+  client?: OAuth2AutenthicationDataClient;
+  request?: OAuth2TokenRequest;
+  issuers?: OAuth2Issuers;
+  scopes?: OAuth2AutenthicationDataScopes;
+  audiences?: OAuth2AutenthicationDataAudiences;
+  /**
+   * The username to use. Used only if the grant type is Password.
+   */
+  username?: string;
+  /**
+   * The password to use. Used only if the grant type is Password.
+   */
+  password?: string;
+  subject?: OAuth2TokenDefinition;
+  actor?: OAuth2TokenDefinition;
+}
+/**
+ * Defines the workflow's reusable components.
+ */
+export interface Use {
+  authentications?: UseAuthentications;
+  errors?: UseErrors;
+  extensions?: UseExtensions;
+  functions?: UseFunctions;
+  retries?: UseRetries;
+  secrets?: UseSecrets;
+  timeouts?: UseTimeouts;
+  catalogs?: UseCatalogs;
+}
+/**
+ * The workflow's reusable authentication policies.
+ */
+export interface UseAuthentications {
+  [k: string]: AuthenticationPolicy;
+}
+/**
+ * The workflow's reusable errors.
+ */
+export interface UseErrors {
+  [k: string]: Error;
+}
+/**
+ * Represents an error.
+ */
+export interface Error {
+  type: ErrorType;
+  /**
+   * The status code generated by the origin for this occurrence of the error.
+   */
+  status: number;
+  instance?: ErrorInstance;
+  /**
+   * A short, human-readable summary of the error.
+   */
+  title?: string;
+  /**
+   * A human-readable explanation specific to this occurrence of the error.
+   */
+  detail?: string;
+}
+export interface ExtensionItem {
+  [k: string]: Extension;
+}
+/**
+ * The definition of an extension.
+ */
+export interface Extension {
+  /**
+   * The type of task to extend.
+   */
+  extend:
+    | 'call'
+    | 'composite'
+    | 'emit'
+    | 'for'
+    | 'listen'
+    | 'raise'
+    | 'run'
+    | 'set'
+    | 'switch'
+    | 'try'
+    | 'wait'
+    | 'all';
+  /**
+   * A runtime expression, if any, used to determine whether or not the extension should apply in the specified context.
+   */
+  when?: string;
+  before?: TaskList;
+  after?: TaskList;
+}
+export interface TaskItem {
+  [k: string]: Task;
+}
+/**
+ * An object inherited by all tasks.
+ */
+export interface TaskBase {
+  if?: TaskBaseIf;
+  input?: Input;
+  output?: Output;
+  export?: Export;
+  timeout?: TaskTimeout;
+  then?: FlowDirective;
+  metadata?: TaskMetadata;
+  [k: string]: unknown;
+}
+/**
+ * Configures the output of a workflow or task.
+ */
+export interface Output {
+  schema?: Schema;
+  as?: OutputAs;
+}
+/**
+ * Set the content of the context. .
+ */
+export interface Export {
+  schema?: Schema;
+  as?: ExportAs;
+}
+/**
+ * The definition of a timeout.
+ */
+export interface Timeout {
+  after: Duration;
+}
+/**
+ * The inline definition of a duration.
+ */
+export interface DurationInline {
+  /**
+   * Number of days, if any.
+   */
+  days?: number;
+  /**
+   * Number of days, if any.
+   */
+  hours?: number;
+  /**
+   * Number of minutes, if any.
+   */
+  minutes?: number;
+  /**
+   * Number of seconds, if any.
+   */
+  seconds?: number;
+  /**
+   * Number of milliseconds, if any.
+   */
+  milliseconds?: number;
+}
+/**
+ * Holds additional information about the task.
+ */
+export interface TaskMetadata {
+  [k: string]: unknown;
+}
+/**
+ * The GRPC call arguments.
+ */
+export interface GRPCArguments {
+  proto: ExternalResource;
+  service: WithGRPCService;
+  /**
+   * The name of the method to call on the defined GRPC service.
+   */
+  method: string;
+  arguments?: WithGRPCArguments;
+}
+export interface WithGRPCService {
+  /**
+   * The name of the GRPC service to call.
+   */
+  name: string;
+  /**
+   * The hostname of the GRPC service to call.
+   */
+  host: string;
+  /**
+   * The port number of the GRPC service to call.
+   */
+  port?: number;
+  authentication?: ReferenceableAuthenticationPolicy;
+}
+/**
+ * The arguments, if any, to call the method with.
+ */
+export interface WithGRPCArguments {
+  [k: string]: unknown;
+}
+/**
+ * The HTTP call arguments.
+ */
+export interface HTTPArguments {
+  /**
+   * The HTTP method of the HTTP request to perform.
+   */
+  method: string;
+  endpoint: Endpoint;
+  headers?: HTTPHeaders;
+  body?: HTTPBody;
+  query?: HTTPQuery;
+  /**
+   * The http call output format. Defaults to 'content'.
+   */
+  output?: 'raw' | 'content' | 'response';
+  /**
+   * Specifies whether redirection status codes (`300–399`) should be treated as errors.
+   */
+  redirect?: boolean;
+}
+/**
+ * A name/value mapping of the headers, if any, of the HTTP request to perform.
+ */
+export interface HTTPHeaders {
+  [k: string]: unknown;
+}
+/**
+ * The body, if any, of the HTTP request to perform.
+ */
+export interface HTTPBody {
+  [k: string]: unknown;
+}
+/**
+ * A name/value mapping of the query parameters, if any, of the HTTP request to perform.
+ */
+export interface HTTPQuery {
+  [k: string]: unknown;
+}
+/**
+ * The OpenAPI call arguments.
+ */
+export interface OpenAPIArguments {
+  document: ExternalResource;
+  /**
+   * The id of the OpenAPI operation to call.
+   */
+  operationId: string;
+  parameters?: WithOpenAPIParameters;
+  authentication?: ReferenceableAuthenticationPolicy;
+  /**
+   * The http call output format. Defaults to 'content'.
+   */
+  output?: 'raw' | 'content' | 'response';
+  /**
+   * Specifies whether redirection status codes (`300–399`) should be treated as errors.
+   */
+  redirect?: boolean;
+}
+/**
+ * A name/value mapping of the parameters of the OpenAPI operation to call.
+ */
+export interface WithOpenAPIParameters {
+  [k: string]: unknown;
+}
+/**
+ * A name/value mapping of the parameters, if any, to call the function with.
+ */
+export interface FunctionArguments {
+  [k: string]: unknown;
+}
+/**
+ * The configuration of the branches to perform concurrently.
+ */
+export interface ForkTaskConfiguration {
+  branches: TaskList;
+  /**
+   * Indicates whether or not the concurrent tasks are racing against each other, with a single possible winner, which sets the composite task's output.
+   */
+  compete?: boolean;
+}
+/**
+ * The configuration of an event's emission.
+ */
+export interface EmitTaskConfiguration {
+  event: EmitEventDefinition;
+}
+/**
+ * The definition of the event to emit.
+ */
+export interface EmitEventDefinition {
+  with?: EmitEventWith;
+  [k: string]: unknown;
+}
+/**
+ * Defines the properties of event to emit.
+ */
+export interface EmitEventWith {
+  /**
+   * The event's unique identifier.
+   */
+  id?: string;
+  source: EventSource;
+  /**
+   * This attribute contains a value describing the type of event related to the originating occurrence.
+   */
+  type: string;
+  time?: EventTime;
+  /**
+   * The subject of the event.
+   */
+  subject?: string;
+  /**
+   * Content type of data value. This attribute enables data to carry any type of content, whereby format and encoding might differ from that of the chosen event format.
+   */
+  datacontenttype?: string;
+  dataschema?: EventDataschema;
+  data?: EventData;
+  [k: string]: unknown;
+}
+/**
+ * The definition of the loop that iterates over a range of values.
+ */
+export interface ForTaskConfiguration {
+  /**
+   * The name of the variable used to store the current item being enumerated.
+   */
+  each?: string;
+  /**
+   * A runtime expression used to get the collection to enumerate.
+   */
+  in: string;
+  /**
+   * The name of the variable used to store the index of the current item being enumerated.
+   */
+  at?: string;
+}
+/**
+ * The configuration of the listener to use.
+ */
+export interface ListenTaskConfiguration {
+  to: EventConsumptionStrategy;
+  /**
+   * Specifies how events are read during the listen operation.
+   */
+  read?: 'data' | 'envelope' | 'raw';
+}
+export interface AllEventConsumptionStrategy {
+  all: AllEventConsumptionStrategyConfiguration;
+  [k: string]: unknown;
+}
+/**
+ * An event filter is a mechanism used to selectively process or handle events based on predefined criteria, such as event type, source, or specific attributes.
+ */
+export interface EventFilter {
+  with: WithEvent;
+  correlate?: EventFilterCorrelate;
+}
+/**
+ * An event filter is a mechanism used to selectively process or handle events based on predefined criteria, such as event type, source, or specific attributes.
+ */
+export interface WithEvent {
+  /**
+   * The event's unique identifier.
+   */
+  id?: string;
+  source?: EventSource;
+  /**
+   * This attribute contains a value describing the type of event related to the originating occurrence.
+   */
+  type?: string;
+  time?: EventTime;
+  /**
+   * The subject of the event.
+   */
+  subject?: string;
+  /**
+   * Content type of data value. This attribute enables data to carry any type of content, whereby format and encoding might differ from that of the chosen event format.
+   */
+  datacontenttype?: string;
+  dataschema?: EventDataschema;
+  data?: EventData;
+  [k: string]: unknown;
+}
+/**
+ * A correlation is a link between events and data, established by mapping event attributes to specific data attributes, allowing for coordinated processing or handling based on event characteristics.
+ */
+export interface EventFilterCorrelate {
+  [k: string]: {
+    /**
+     * A runtime expression used to extract the correlation value from the filtered event.
+     */
+    from: string;
+    /**
+     * A constant or a runtime expression, if any, used to determine whether or not the extracted correlation value matches expectations. If not set, the first extracted value will be used as the correlation's expectation.
+     */
+    expect?: string;
+    [k: string]: unknown;
+  };
+}
+export interface AnyEventConsumptionStrategy {
+  any: AnyEventConsumptionStrategyConfiguration;
+  until?: AnyEventConsumptionStrategyUntil;
+  [k: string]: unknown;
+}
+export interface OneEventConsumptionStrategy {
+  one: EventFilter;
+  [k: string]: unknown;
+}
+/**
+ * Configures the iteration over each item (event or message) consumed by a subscription.
+ */
+export interface SubscriptionIterator {
+  /**
+   * The name of the variable used to store the current item being enumerated.
+   */
+  item?: string;
+  /**
+   * The name of the variable used to store the index of the current item being enumerated.
+   */
+  at?: string;
+  do?: TaskList;
+  output?: Output;
+  export?: Export;
+}
+/**
+ * The definition of the error to raise.
+ */
+export interface RaiseTaskConfiguration {
+  error: RaiseTaskError;
+}
+/**
+ * Enables the execution of external processes encapsulated within a containerized environment.
+ */
+export interface RunContainer {
+  container: Container;
+  [k: string]: unknown;
+}
+/**
+ * The configuration of the container to run.
+ */
+export interface Container {
+  /**
+   * The name of the container image to run.
+   */
+  image: string;
+  /**
+   * A runtime expression, if any, used to give specific name to the container.
+   */
+  name?: string;
+  /**
+   * The command, if any, to execute on the container.
+   */
+  command?: string;
+  ports?: ContainerPorts;
+  volumes?: ContainerVolumes;
+  environment?: ContainerEnvironment;
+  lifetime?: ContainerLifetime;
+}
+/**
+ * The container's port mappings, if any.
+ */
+export interface ContainerPorts {
+  [k: string]: unknown;
+}
+/**
+ * The container's volume mappings, if any.
+ */
+export interface ContainerVolumes {
+  [k: string]: unknown;
+}
+/**
+ * A key/value mapping of the environment variables, if any, to use when running the configured process.
+ */
+export interface ContainerEnvironment {
+  [k: string]: unknown;
+}
+/**
+ * The configuration of a container's lifetime
+ */
+export interface ContainerLifetime {
+  /**
+   * The container cleanup policy to use
+   */
+  cleanup: 'always' | 'never' | 'eventually';
+  after?: Duration;
+}
+/**
+ * Enables the execution of custom scripts or code within a workflow, empowering workflows to perform specialized logic, data processing, or integration tasks by executing user-defined scripts written in various programming languages.
+ */
+export interface RunScript {
+  script: Script;
+  [k: string]: unknown;
+}
+/**
+ * The script's code.
+ */
+export interface InlineScript {
+  code: string;
+  [k: string]: unknown;
+}
+/**
+ * The script's resource.
+ */
+export interface ExternalScript {
+  source: ExternalResource;
+  [k: string]: unknown;
+}
+/**
+ * Enables the execution of shell commands within a workflow, enabling workflows to interact with the underlying operating system and perform system-level operations, such as file manipulation, environment configuration, or system administration tasks.
+ */
+export interface RunShell {
+  shell: Shell;
+  [k: string]: unknown;
+}
+/**
+ * The configuration of the shell command to run.
+ */
+export interface Shell {
+  /**
+   * The shell command to run.
+   */
+  command: string;
+  arguments?: ShellArguments;
+  environment?: ShellEnvironment;
+}
+/**
+ * A list of the arguments of the shell command to run.
+ */
+export interface ShellArguments {
+  [k: string]: unknown;
+}
+/**
+ * A key/value mapping of the environment variables, if any, to use when running the configured process.
+ */
+export interface ShellEnvironment {
+  [k: string]: unknown;
+}
+/**
+ * Enables the invocation and execution of nested workflows within a parent workflow, facilitating modularization, reusability, and abstraction of complex logic or business processes by encapsulating them into standalone workflow units.
+ */
+export interface RunWorkflow {
+  workflow: SubflowConfiguration;
+  [k: string]: unknown;
+}
+/**
+ * The configuration of the workflow to run.
+ */
+export interface SubflowConfiguration {
+  /**
+   * The namespace the workflow to run belongs to.
+   */
+  namespace: string;
+  /**
+   * The name of the workflow to run.
+   */
+  name: string;
+  /**
+   * The version of the workflow to run. Defaults to latest.
+   */
+  version: string;
+  input?: SubflowInput;
+}
+/**
+ * The data, if any, to pass as input to the workflow to execute. The value should be validated against the target workflow's input schema, if specified.
+ */
+export interface SubflowInput {
+  [k: string]: unknown;
+}
+/**
+ * The data to set.
+ */
+export interface SetTaskConfiguration {
+  [k: string]: unknown;
+}
+export interface SwitchItem {
+  [k: string]: SwitchCase;
+}
+/**
+ * The definition of a case within a switch task, defining a condition and corresponding tasks to execute if the condition is met.
+ */
+export interface SwitchCase {
+  /**
+   * A runtime expression used to determine whether or not the case matches.
+   */
+  when?: string;
+  then: FlowDirective;
+  [k: string]: unknown;
+}
+/**
+ * The object used to define the errors to catch.
+ */
+export interface TryTaskCatch {
+  errors?: CatchErrors;
+  /**
+   * The name of the runtime expression variable to save the error as. Defaults to 'error'.
+   */
+  as?: string;
+  /**
+   * A runtime expression used to determine whether to catch the filtered error.
+   */
+  when?: string;
+  /**
+   * A runtime expression used to determine whether not to catch the filtered error.
+   */
+  exceptWhen?: string;
+  retry?: TryTaskCatchRetry;
+  do?: TaskList;
+}
+/**
+ * static error filter
+ */
+export interface CatchErrors {
+  with?: ErrorFilter;
+  [k: string]: unknown;
+}
+/**
+ * Error filtering base on static values. For error filtering on dynamic values, use catch.when property
+ */
+export interface ErrorFilter {
+  /**
+   * if present, means this value should be used for filtering
+   */
+  type?: string;
+  /**
+   * if present, means this value should be used for filtering
+   */
+  status?: number;
+  /**
+   * if present, means this value should be used for filtering
+   */
+  instance?: string;
+  /**
+   * if present, means this value should be used for filtering
+   */
+  title?: string;
+  /**
+   * if present, means this value should be used for filtering
+   */
+  details?: string;
+  [k: string]: unknown;
+}
+/**
+ * Defines a retry policy.
+ */
+export interface RetryPolicy {
+  /**
+   * A runtime expression, if any, used to determine whether or not to retry running the task, in a given context.
+   */
+  when?: string;
+  /**
+   * A runtime expression used to determine whether or not to retry running the task, in a given context.
+   */
+  exceptWhen?: string;
+  delay?: Duration;
+  backoff?: RetryBackoff;
+  limit?: RetryLimit;
+  jitter?: RetryPolicyJitter;
+}
+export interface ConstantBackoff {
+  /**
+   * The definition of the constant backoff to use, if any.
+   */
+  constant: {
+    [k: string]: unknown;
+  };
+  [k: string]: unknown;
+}
+export interface ExponentialBackOff {
+  /**
+   * The definition of the exponential backoff to use, if any.
+   */
+  exponential: {
+    [k: string]: unknown;
+  };
+  [k: string]: unknown;
+}
+export interface LinearBackoff {
+  /**
+   * The definition of the linear backoff to use, if any.
+   */
+  linear: {
+    [k: string]: unknown;
+  };
+  [k: string]: unknown;
+}
+/**
+ * The retry limit, if any.
+ */
+export interface RetryLimit {
+  attempt?: RetryLimitAttempt;
+  duration?: Duration;
+}
+export interface RetryLimitAttempt {
+  /**
+   * The maximum amount of retry attempts, if any.
+   */
+  count?: number;
+  duration?: Duration;
+}
+/**
+ * The parameters, if any, that control the randomness or variability of the delay between retry attempts.
+ */
+export interface RetryPolicyJitter {
+  from: Duration;
+  to: Duration;
+}
+/**
+ * The workflow's reusable functions.
+ */
+export interface UseFunctions {
+  [k: string]: Task;
+}
+/**
+ * The workflow's reusable retry policies.
+ */
+export interface UseRetries {
+  [k: string]: RetryPolicy;
+}
+/**
+ * The workflow's reusable timeouts.
+ */
+export interface UseTimeouts {
+  [k: string]: Timeout;
+}
+/**
+ * The workflow's reusable catalogs.
+ */
+export interface UseCatalogs {
+  [k: string]: Catalog;
+}
+/**
+ * The definition of a resource catalog.
+ */
+export interface Catalog {
+  endpoint: Endpoint;
+}
+/**
+ * Schedules the workflow.
+ */
+export interface Schedule {
+  every?: Duration;
+  /**
+   * Specifies the schedule using a cron expression, e.g., '0 0 * * *' for daily at midnight.
+   */
+  cron?: string;
+  after?: Duration;
+  on?: EventConsumptionStrategy;
+}
diff --git a/src/lib/schema/validation/README.md b/src/lib/generated/schema/README.md
similarity index 100%
rename from src/lib/schema/validation/README.md
rename to src/lib/generated/schema/README.md
diff --git a/src/lib/generated/schema/__internal_workflow.json b/src/lib/generated/schema/__internal_workflow.json
new file mode 100644
index 00000000..81272f14
--- /dev/null
+++ b/src/lib/generated/schema/__internal_workflow.json
@@ -0,0 +1,2745 @@
+{
+  "$id": "https://serverlessworkflow.io/schemas/1.0.0/workflow.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "description": "Serverless Workflow DSL - Workflow Schema.",
+  "type": "object",
+  "required": [
+    "document",
+    "do"
+  ],
+  "properties": {
+    "document": {
+      "type": "object",
+      "title": "Document",
+      "description": "Documents the workflow.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "dsl": {
+          "type": "string",
+          "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$",
+          "description": "The version of the DSL used by the workflow."
+        },
+        "namespace": {
+          "type": "string",
+          "pattern": "^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$",
+          "description": "The workflow's namespace."
+        },
+        "name": {
+          "type": "string",
+          "pattern": "^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$",
+          "description": "The workflow's name."
+        },
+        "version": {
+          "type": "string",
+          "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$",
+          "description": "The workflow's semantic version."
+        },
+        "title": {
+          "type": "string",
+          "description": "The workflow's title."
+        },
+        "summary": {
+          "type": "string",
+          "description": "The workflow's Markdown summary."
+        },
+        "tags": {
+          "type": "object",
+          "title": "WorkflowTags",
+          "description": "A key/value mapping of the workflow's tags, if any.",
+          "additionalProperties": true
+        },
+        "metadata": {
+          "type": "object",
+          "title": "WorkflowMetadata",
+          "description": "Holds additional information about the workflow.",
+          "additionalProperties": true
+        }
+      },
+      "required": [
+        "dsl",
+        "namespace",
+        "name",
+        "version"
+      ]
+    },
+    "input": {
+      "$ref": "#/$defs/input",
+      "title": "Input",
+      "description": "Configures the workflow's input.",
+      "type": "object"
+    },
+    "use": {
+      "type": "object",
+      "title": "Use",
+      "description": "Defines the workflow's reusable components.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "authentications": {
+          "type": "object",
+          "title": "UseAuthentications",
+          "description": "The workflow's reusable authentication policies.",
+          "additionalProperties": {
+            "$ref": "#/$defs/authenticationPolicy"
+          }
+        },
+        "errors": {
+          "type": "object",
+          "title": "UseErrors",
+          "description": "The workflow's reusable errors.",
+          "additionalProperties": {
+            "$ref": "#/$defs/error"
+          }
+        },
+        "extensions": {
+          "type": "array",
+          "title": "UseExtensions",
+          "description": "The workflow's extensions.",
+          "items": {
+            "type": "object",
+            "title": "ExtensionItem",
+            "minProperties": 1,
+            "maxProperties": 1,
+            "additionalProperties": {
+              "$ref": "#/$defs/extension"
+            }
+          }
+        },
+        "functions": {
+          "type": "object",
+          "title": "UseFunctions",
+          "description": "The workflow's reusable functions.",
+          "additionalProperties": {
+            "$ref": "#/$defs/task"
+          }
+        },
+        "retries": {
+          "type": "object",
+          "title": "UseRetries",
+          "description": "The workflow's reusable retry policies.",
+          "additionalProperties": {
+            "$ref": "#/$defs/retryPolicy"
+          }
+        },
+        "secrets": {
+          "type": "array",
+          "title": "UseSecrets",
+          "description": "The workflow's reusable secrets.",
+          "items": {
+            "type": "string",
+            "description": "The workflow's secrets."
+          }
+        },
+        "timeouts": {
+          "type": "object",
+          "title": "UseTimeouts",
+          "description": "The workflow's reusable timeouts.",
+          "additionalProperties": {
+            "$ref": "#/$defs/timeout"
+          }
+        },
+        "catalogs": {
+          "type": "object",
+          "title": "UseCatalogs",
+          "description": "The workflow's reusable catalogs.",
+          "additionalProperties": {
+            "$ref": "#/$defs/catalog"
+          }
+        }
+      }
+    },
+    "do": {
+      "$ref": "#/$defs/taskList",
+      "title": "Do",
+      "description": "Defines the task(s) the workflow must perform.",
+      "type": "object"
+    },
+    "timeout": {
+      "title": "WorkflowTimeout",
+      "oneOf": [
+        {
+          "$ref": "#/$defs/timeout",
+          "title": "TimeoutDefinition",
+          "description": "The workflow's timeout configuration, if any.",
+          "type": "object"
+        },
+        {
+          "type": "string",
+          "description": "The name of the workflow's timeout, if any."
+        }
+      ]
+    },
+    "output": {
+      "$ref": "#/$defs/output",
+      "title": "Output",
+      "description": "Configures the workflow's output.",
+      "type": "object"
+    },
+    "schedule": {
+      "type": "object",
+      "title": "Schedule",
+      "description": "Schedules the workflow.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "every": {
+          "$ref": "#/$defs/duration",
+          "title": "ScheduleEvery",
+          "description": "Specifies the duration of the interval at which the workflow should be executed.",
+          "type": "object"
+        },
+        "cron": {
+          "type": "string",
+          "description": "Specifies the schedule using a cron expression, e.g., '0 0 * * *' for daily at midnight."
+        },
+        "after": {
+          "$ref": "#/$defs/duration",
+          "title": "ScheduleAfter",
+          "description": "Specifies a delay duration that the workflow must wait before starting again after it completes.",
+          "type": "object"
+        },
+        "on": {
+          "$ref": "#/$defs/eventConsumptionStrategy",
+          "title": "ScheduleOn",
+          "description": "Specifies the events that trigger the workflow execution.",
+          "type": "object"
+        }
+      }
+    }
+  },
+  "$defs": {
+    "taskList": {
+      "title": "TaskList",
+      "description": "List of named tasks to perform.",
+      "type": "array",
+      "items": {
+        "type": "object",
+        "title": "TaskItem",
+        "minProperties": 1,
+        "maxProperties": 1,
+        "additionalProperties": {
+          "$ref": "#/$defs/task"
+        }
+      }
+    },
+    "taskBase": {
+      "type": "object",
+      "title": "TaskBase",
+      "description": "An object inherited by all tasks.",
+      "properties": {
+        "if": {
+          "type": "string",
+          "title": "TaskBaseIf",
+          "description": "A runtime expression, if any, used to determine whether or not the task should be run."
+        },
+        "input": {
+          "$ref": "#/$defs/input",
+          "title": "TaskBaseInput",
+          "description": "Configure the task's input.",
+          "type": "object"
+        },
+        "output": {
+          "$ref": "#/$defs/output",
+          "title": "TaskBaseOutput",
+          "description": "Configure the task's output.",
+          "type": "object"
+        },
+        "export": {
+          "$ref": "#/$defs/export",
+          "title": "TaskBaseExport",
+          "description": "Export task output to context.",
+          "type": "object"
+        },
+        "timeout": {
+          "title": "TaskTimeout",
+          "oneOf": [
+            {
+              "$ref": "#/$defs/timeout",
+              "title": "TaskTimeoutDefinition",
+              "description": "The task's timeout configuration, if any.",
+              "type": "object"
+            },
+            {
+              "type": "string",
+              "description": "The name of the task's timeout, if any."
+            }
+          ]
+        },
+        "then": {
+          "$ref": "#/$defs/flowDirective",
+          "title": "TaskBaseThen",
+          "description": "The flow directive to be performed upon completion of the task.",
+          "type": "object"
+        },
+        "metadata": {
+          "type": "object",
+          "title": "TaskMetadata",
+          "description": "Holds additional information about the task.",
+          "additionalProperties": true
+        }
+      }
+    },
+    "task": {
+      "title": "Task",
+      "description": "A discrete unit of work that contributes to achieving the overall objectives defined by the workflow.",
+      "unevaluatedProperties": false,
+      "oneOf": [
+        {
+          "$ref": "#/$defs/callTask",
+          "type": "object"
+        },
+        {
+          "$ref": "#/$defs/doTask",
+          "type": "object"
+        },
+        {
+          "$ref": "#/$defs/forkTask",
+          "type": "object"
+        },
+        {
+          "$ref": "#/$defs/emitTask",
+          "type": "object"
+        },
+        {
+          "$ref": "#/$defs/forTask",
+          "type": "object"
+        },
+        {
+          "$ref": "#/$defs/listenTask",
+          "type": "object"
+        },
+        {
+          "$ref": "#/$defs/raiseTask",
+          "type": "object"
+        },
+        {
+          "$ref": "#/$defs/runTask",
+          "type": "object"
+        },
+        {
+          "$ref": "#/$defs/setTask",
+          "type": "object"
+        },
+        {
+          "$ref": "#/$defs/switchTask",
+          "type": "object"
+        },
+        {
+          "$ref": "#/$defs/tryTask",
+          "type": "object"
+        },
+        {
+          "$ref": "#/$defs/waitTask",
+          "type": "object"
+        }
+      ]
+    },
+    "callTask": {
+      "title": "CallTask",
+      "description": "Defines the call to perform.",
+      "oneOf": [
+        {
+          "title": "CallAsyncAPI",
+          "description": "Defines the AsyncAPI call to perform.",
+          "$ref": "#/$defs/taskBase",
+          "type": "object",
+          "required": [
+            "call",
+            "with"
+          ],
+          "unevaluatedProperties": false,
+          "properties": {
+            "call": {
+              "type": "string",
+              "const": "asyncapi"
+            },
+            "with": {
+              "type": "object",
+              "title": "AsyncApiArguments",
+              "description": "The Async API call arguments.",
+              "properties": {
+                "document": {
+                  "$ref": "#/$defs/externalResource",
+                  "title": "AsyncAPIDocument",
+                  "description": "The document that defines the AsyncAPI operation to call.",
+                  "type": "object"
+                },
+                "channel": {
+                  "type": "string",
+                  "description": "The name of the channel on which to perform the operation. Used only in case the referenced document uses AsyncAPI v2.6.0."
+                },
+                "operation": {
+                  "type": "string",
+                  "description": "A reference to the AsyncAPI operation to call."
+                },
+                "server": {
+                  "$ref": "#/$defs/asyncApiServer",
+                  "title": "AsyncAPIServer",
+                  "description": "An object used to configure to the server to call the specified AsyncAPI operation on.",
+                  "type": "object"
+                },
+                "protocol": {
+                  "type": "string",
+                  "description": "The protocol to use to select the target server.",
+                  "enum": [
+                    "amqp",
+                    "amqp1",
+                    "anypointmq",
+                    "googlepubsub",
+                    "http",
+                    "ibmmq",
+                    "jms",
+                    "kafka",
+                    "mercure",
+                    "mqtt",
+                    "mqtt5",
+                    "nats",
+                    "pulsar",
+                    "redis",
+                    "sns",
+                    "solace",
+                    "sqs",
+                    "stomp",
+                    "ws"
+                  ]
+                },
+                "message": {
+                  "$ref": "#/$defs/asyncApiOutboundMessage",
+                  "title": "AsyncApiMessage",
+                  "description": "An object used to configure the message to publish using the target operation.",
+                  "type": "object"
+                },
+                "subscription": {
+                  "$ref": "#/$defs/asyncApiSubscription",
+                  "title": "AsyncApiSubscription",
+                  "description": "An object used to configure the subscription to messages consumed using the target operation.",
+                  "type": "object"
+                },
+                "authentication": {
+                  "$ref": "#/$defs/referenceableAuthenticationPolicy",
+                  "title": "AsyncAPIAuthentication",
+                  "description": "The authentication policy, if any, to use when calling the AsyncAPI operation.",
+                  "type": "object"
+                }
+              },
+              "oneOf": [
+                {
+                  "required": [
+                    "document",
+                    "operation",
+                    "message"
+                  ],
+                  "type": "object"
+                },
+                {
+                  "required": [
+                    "document",
+                    "operation",
+                    "subscription"
+                  ],
+                  "type": "object"
+                },
+                {
+                  "required": [
+                    "document",
+                    "channel",
+                    "message"
+                  ],
+                  "type": "object"
+                },
+                {
+                  "required": [
+                    "document",
+                    "channel",
+                    "subscription"
+                  ],
+                  "type": "object"
+                }
+              ],
+              "unevaluatedProperties": false
+            }
+          }
+        },
+        {
+          "title": "CallGRPC",
+          "description": "Defines the GRPC call to perform.",
+          "$ref": "#/$defs/taskBase",
+          "type": "object",
+          "unevaluatedProperties": false,
+          "required": [
+            "call",
+            "with"
+          ],
+          "properties": {
+            "call": {
+              "type": "string",
+              "const": "grpc"
+            },
+            "with": {
+              "type": "object",
+              "title": "GRPCArguments",
+              "description": "The GRPC call arguments.",
+              "properties": {
+                "proto": {
+                  "$ref": "#/$defs/externalResource",
+                  "title": "WithGRPCProto",
+                  "description": "The proto resource that describes the GRPC service to call.",
+                  "type": "object"
+                },
+                "service": {
+                  "type": "object",
+                  "title": "WithGRPCService",
+                  "unevaluatedProperties": false,
+                  "properties": {
+                    "name": {
+                      "type": "string",
+                      "description": "The name of the GRPC service to call."
+                    },
+                    "host": {
+                      "type": "string",
+                      "description": "The hostname of the GRPC service to call.",
+                      "pattern": "^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$"
+                    },
+                    "port": {
+                      "type": "integer",
+                      "description": "The port number of the GRPC service to call.",
+                      "minimum": 0,
+                      "maximum": 65535
+                    },
+                    "authentication": {
+                      "$ref": "#/$defs/referenceableAuthenticationPolicy",
+                      "title": "WithGRPCServiceAuthentication",
+                      "description": "The endpoint's authentication policy, if any.",
+                      "type": "object"
+                    }
+                  },
+                  "required": [
+                    "name",
+                    "host"
+                  ]
+                },
+                "method": {
+                  "type": "string",
+                  "description": "The name of the method to call on the defined GRPC service."
+                },
+                "arguments": {
+                  "type": "object",
+                  "title": "WithGRPCArguments",
+                  "description": "The arguments, if any, to call the method with.",
+                  "additionalProperties": true
+                }
+              },
+              "required": [
+                "proto",
+                "service",
+                "method"
+              ],
+              "unevaluatedProperties": false
+            }
+          }
+        },
+        {
+          "title": "CallHTTP",
+          "description": "Defines the HTTP call to perform.",
+          "$ref": "#/$defs/taskBase",
+          "type": "object",
+          "unevaluatedProperties": false,
+          "required": [
+            "call",
+            "with"
+          ],
+          "properties": {
+            "call": {
+              "type": "string",
+              "const": "http"
+            },
+            "with": {
+              "type": "object",
+              "title": "HTTPArguments",
+              "description": "The HTTP call arguments.",
+              "properties": {
+                "method": {
+                  "type": "string",
+                  "description": "The HTTP method of the HTTP request to perform."
+                },
+                "endpoint": {
+                  "title": "HTTPEndpoint",
+                  "description": "The HTTP endpoint to send the request to.",
+                  "$ref": "#/$defs/endpoint",
+                  "type": "object"
+                },
+                "headers": {
+                  "type": "object",
+                  "title": "HTTPHeaders",
+                  "description": "A name/value mapping of the headers, if any, of the HTTP request to perform."
+                },
+                "body": {
+                  "title": "HTTPBody",
+                  "description": "The body, if any, of the HTTP request to perform.",
+                  "type": "object"
+                },
+                "query": {
+                  "type": "object",
+                  "title": "HTTPQuery",
+                  "description": "A name/value mapping of the query parameters, if any, of the HTTP request to perform.",
+                  "additionalProperties": true
+                },
+                "output": {
+                  "type": "string",
+                  "description": "The http call output format. Defaults to 'content'.",
+                  "enum": [
+                    "raw",
+                    "content",
+                    "response"
+                  ]
+                },
+                "redirect": {
+                  "type": "boolean",
+                  "description": "Specifies whether redirection status codes (`300–399`) should be treated as errors."
+                }
+              },
+              "required": [
+                "method",
+                "endpoint"
+              ],
+              "unevaluatedProperties": false
+            }
+          }
+        },
+        {
+          "title": "CallOpenAPI",
+          "description": "Defines the OpenAPI call to perform.",
+          "$ref": "#/$defs/taskBase",
+          "type": "object",
+          "unevaluatedProperties": false,
+          "required": [
+            "call",
+            "with"
+          ],
+          "properties": {
+            "call": {
+              "type": "string",
+              "const": "openapi"
+            },
+            "with": {
+              "type": "object",
+              "title": "OpenAPIArguments",
+              "description": "The OpenAPI call arguments.",
+              "properties": {
+                "document": {
+                  "$ref": "#/$defs/externalResource",
+                  "title": "WithOpenAPIDocument",
+                  "description": "The document that defines the OpenAPI operation to call.",
+                  "type": "object"
+                },
+                "operationId": {
+                  "type": "string",
+                  "description": "The id of the OpenAPI operation to call."
+                },
+                "parameters": {
+                  "type": "object",
+                  "title": "WithOpenAPIParameters",
+                  "description": "A name/value mapping of the parameters of the OpenAPI operation to call.",
+                  "additionalProperties": true
+                },
+                "authentication": {
+                  "$ref": "#/$defs/referenceableAuthenticationPolicy",
+                  "title": "WithOpenAPIAuthentication",
+                  "description": "The authentication policy, if any, to use when calling the OpenAPI operation.",
+                  "type": "object"
+                },
+                "output": {
+                  "type": "string",
+                  "enum": [
+                    "raw",
+                    "content",
+                    "response"
+                  ],
+                  "description": "The http call output format. Defaults to 'content'."
+                },
+                "redirect": {
+                  "type": "boolean",
+                  "description": "Specifies whether redirection status codes (`300–399`) should be treated as errors."
+                }
+              },
+              "required": [
+                "document",
+                "operationId"
+              ],
+              "unevaluatedProperties": false
+            }
+          }
+        },
+        {
+          "title": "CallFunction",
+          "description": "Defines the function call to perform.",
+          "$ref": "#/$defs/taskBase",
+          "type": "object",
+          "unevaluatedProperties": false,
+          "required": [
+            "call"
+          ],
+          "properties": {
+            "call": {
+              "type": "string",
+              "not": {
+                "enum": [
+                  "asyncapi",
+                  "grpc",
+                  "http",
+                  "openapi"
+                ]
+              },
+              "description": "The name of the function to call."
+            },
+            "with": {
+              "type": "object",
+              "title": "FunctionArguments",
+              "description": "A name/value mapping of the parameters, if any, to call the function with.",
+              "additionalProperties": true
+            }
+          }
+        }
+      ]
+    },
+    "forkTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "ForkTask",
+      "description": "Allows workflows to execute multiple tasks concurrently and optionally race them against each other, with a single possible winner, which sets the task's output.",
+      "unevaluatedProperties": false,
+      "required": [
+        "fork"
+      ],
+      "properties": {
+        "fork": {
+          "type": "object",
+          "title": "ForkTaskConfiguration",
+          "description": "The configuration of the branches to perform concurrently.",
+          "unevaluatedProperties": false,
+          "required": [
+            "branches"
+          ],
+          "properties": {
+            "branches": {
+              "$ref": "#/$defs/taskList",
+              "title": "ForkBranches",
+              "type": "object"
+            },
+            "compete": {
+              "type": "boolean",
+              "description": "Indicates whether or not the concurrent tasks are racing against each other, with a single possible winner, which sets the composite task's output.",
+              "default": false
+            }
+          }
+        }
+      }
+    },
+    "doTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "DoTask",
+      "description": "Allows to execute a list of tasks in sequence.",
+      "unevaluatedProperties": false,
+      "required": [
+        "do"
+      ],
+      "properties": {
+        "do": {
+          "$ref": "#/$defs/taskList",
+          "title": "DoTaskConfiguration",
+          "description": "The configuration of the tasks to perform sequentially.",
+          "type": "object"
+        }
+      }
+    },
+    "emitTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "EmitTask",
+      "description": "Allows workflows to publish events to event brokers or messaging systems, facilitating communication and coordination between different components and services.",
+      "required": [
+        "emit"
+      ],
+      "unevaluatedProperties": false,
+      "properties": {
+        "emit": {
+          "type": "object",
+          "title": "EmitTaskConfiguration",
+          "description": "The configuration of an event's emission.",
+          "unevaluatedProperties": false,
+          "properties": {
+            "event": {
+              "type": "object",
+              "title": "EmitEventDefinition",
+              "description": "The definition of the event to emit.",
+              "properties": {
+                "with": {
+                  "$ref": "#/$defs/eventProperties",
+                  "title": "EmitEventWith",
+                  "description": "Defines the properties of event to emit.",
+                  "required": [
+                    "source",
+                    "type"
+                  ],
+                  "type": "object"
+                }
+              },
+              "additionalProperties": true
+            }
+          },
+          "required": [
+            "event"
+          ]
+        }
+      }
+    },
+    "forTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "ForTask",
+      "description": "Allows workflows to iterate over a collection of items, executing a defined set of subtasks for each item in the collection. This task type is instrumental in handling scenarios such as batch processing, data transformation, and repetitive operations across datasets.",
+      "required": [
+        "for",
+        "do"
+      ],
+      "unevaluatedProperties": false,
+      "properties": {
+        "for": {
+          "type": "object",
+          "title": "ForTaskConfiguration",
+          "description": "The definition of the loop that iterates over a range of values.",
+          "unevaluatedProperties": false,
+          "properties": {
+            "each": {
+              "type": "string",
+              "description": "The name of the variable used to store the current item being enumerated.",
+              "default": "item"
+            },
+            "in": {
+              "type": "string",
+              "description": "A runtime expression used to get the collection to enumerate."
+            },
+            "at": {
+              "type": "string",
+              "description": "The name of the variable used to store the index of the current item being enumerated.",
+              "default": "index"
+            }
+          },
+          "required": [
+            "in"
+          ]
+        },
+        "while": {
+          "type": "string",
+          "description": "A runtime expression that represents the condition, if any, that must be met for the iteration to continue."
+        },
+        "do": {
+          "$ref": "#/$defs/taskList",
+          "title": "ForTaskDo",
+          "type": "object"
+        }
+      }
+    },
+    "listenTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "ListenTask",
+      "description": "Provides a mechanism for workflows to await and react to external events, enabling event-driven behavior within workflow systems.",
+      "required": [
+        "listen"
+      ],
+      "unevaluatedProperties": false,
+      "properties": {
+        "listen": {
+          "type": "object",
+          "title": "ListenTaskConfiguration",
+          "description": "The configuration of the listener to use.",
+          "unevaluatedProperties": false,
+          "properties": {
+            "to": {
+              "$ref": "#/$defs/eventConsumptionStrategy",
+              "title": "ListenTo",
+              "description": "Defines the event(s) to listen to.",
+              "type": "object"
+            },
+            "read": {
+              "type": "string",
+              "enum": [
+                "data",
+                "envelope",
+                "raw"
+              ],
+              "default": "data",
+              "description": "Specifies how events are read during the listen operation."
+            }
+          },
+          "required": [
+            "to"
+          ]
+        },
+        "foreach": {
+          "$ref": "#/$defs/subscriptionIterator",
+          "title": "ListenIterator",
+          "description": "Configures the iterator, if any, for processing consumed event(s).",
+          "type": "object"
+        }
+      }
+    },
+    "raiseTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "RaiseTask",
+      "description": "Intentionally triggers and propagates errors.",
+      "required": [
+        "raise"
+      ],
+      "unevaluatedProperties": false,
+      "properties": {
+        "raise": {
+          "type": "object",
+          "title": "RaiseTaskConfiguration",
+          "description": "The definition of the error to raise.",
+          "unevaluatedProperties": false,
+          "properties": {
+            "error": {
+              "title": "RaiseTaskError",
+              "oneOf": [
+                {
+                  "$ref": "#/$defs/error",
+                  "title": "RaiseErrorDefinition",
+                  "description": "Defines the error to raise.",
+                  "type": "object"
+                },
+                {
+                  "type": "string",
+                  "description": "The name of the error to raise"
+                }
+              ]
+            }
+          },
+          "required": [
+            "error"
+          ]
+        }
+      }
+    },
+    "runTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "RunTask",
+      "description": "Provides the capability to execute external containers, shell commands, scripts, or workflows.",
+      "required": [
+        "run"
+      ],
+      "unevaluatedProperties": false,
+      "properties": {
+        "run": {
+          "type": "object",
+          "title": "RunTaskConfiguration",
+          "description": "The configuration of the process to execute.",
+          "unevaluatedProperties": false,
+          "properties": {
+            "await": {
+              "type": "boolean",
+              "default": true,
+              "description": "Whether to await the process completion before continuing."
+            },
+            "return": {
+              "type": "string",
+              "description": "Configures the output of the process.",
+              "enum": [
+                "stdout",
+                "stderr",
+                "code",
+                "all",
+                "none"
+              ],
+              "default": "stdout"
+            }
+          },
+          "oneOf": [
+            {
+              "title": "RunContainer",
+              "description": "Enables the execution of external processes encapsulated within a containerized environment.",
+              "properties": {
+                "container": {
+                  "type": "object",
+                  "title": "Container",
+                  "description": "The configuration of the container to run.",
+                  "unevaluatedProperties": false,
+                  "properties": {
+                    "image": {
+                      "type": "string",
+                      "description": "The name of the container image to run."
+                    },
+                    "name": {
+                      "type": "string",
+                      "description": "A runtime expression, if any, used to give specific name to the container."
+                    },
+                    "command": {
+                      "type": "string",
+                      "description": "The command, if any, to execute on the container."
+                    },
+                    "ports": {
+                      "type": "object",
+                      "title": "ContainerPorts",
+                      "description": "The container's port mappings, if any."
+                    },
+                    "volumes": {
+                      "type": "object",
+                      "title": "ContainerVolumes",
+                      "description": "The container's volume mappings, if any."
+                    },
+                    "environment": {
+                      "type": "object",
+                      "title": "ContainerEnvironment",
+                      "description": "A key/value mapping of the environment variables, if any, to use when running the configured process."
+                    },
+                    "lifetime": {
+                      "$ref": "#/$defs/containerLifetime",
+                      "title": "ContainerLifetime",
+                      "description": "An object, if any, used to configure the container's lifetime",
+                      "type": "object"
+                    }
+                  },
+                  "required": [
+                    "image"
+                  ]
+                }
+              },
+              "required": [
+                "container"
+              ],
+              "type": "object"
+            },
+            {
+              "title": "RunScript",
+              "description": "Enables the execution of custom scripts or code within a workflow, empowering workflows to perform specialized logic, data processing, or integration tasks by executing user-defined scripts written in various programming languages.",
+              "properties": {
+                "script": {
+                  "type": "object",
+                  "title": "Script",
+                  "description": "The configuration of the script to run.",
+                  "unevaluatedProperties": false,
+                  "properties": {
+                    "language": {
+                      "type": "string",
+                      "description": "The language of the script to run."
+                    },
+                    "arguments": {
+                      "type": "object",
+                      "title": "ScriptArguments",
+                      "description": "A key/value mapping of the arguments, if any, to use when running the configured script.",
+                      "additionalProperties": true
+                    },
+                    "environment": {
+                      "type": "object",
+                      "title": "ScriptEnvironment",
+                      "description": "A key/value mapping of the environment variables, if any, to use when running the configured script process.",
+                      "additionalProperties": true
+                    }
+                  },
+                  "oneOf": [
+                    {
+                      "title": "InlineScript",
+                      "type": "object",
+                      "description": "The script's code.",
+                      "properties": {
+                        "code": {
+                          "type": "string"
+                        }
+                      },
+                      "required": [
+                        "code"
+                      ]
+                    },
+                    {
+                      "title": "ExternalScript",
+                      "type": "object",
+                      "description": "The script's resource.",
+                      "properties": {
+                        "source": {
+                          "$ref": "#/$defs/externalResource",
+                          "title": "ExternalScriptResource",
+                          "type": "object"
+                        }
+                      },
+                      "required": [
+                        "source"
+                      ]
+                    }
+                  ],
+                  "required": [
+                    "language"
+                  ]
+                }
+              },
+              "required": [
+                "script"
+              ],
+              "type": "object"
+            },
+            {
+              "title": "RunShell",
+              "description": "Enables the execution of shell commands within a workflow, enabling workflows to interact with the underlying operating system and perform system-level operations, such as file manipulation, environment configuration, or system administration tasks.",
+              "properties": {
+                "shell": {
+                  "type": "object",
+                  "title": "Shell",
+                  "description": "The configuration of the shell command to run.",
+                  "unevaluatedProperties": false,
+                  "properties": {
+                    "command": {
+                      "type": "string",
+                      "description": "The shell command to run."
+                    },
+                    "arguments": {
+                      "type": "object",
+                      "title": "ShellArguments",
+                      "description": "A list of the arguments of the shell command to run.",
+                      "additionalProperties": true
+                    },
+                    "environment": {
+                      "type": "object",
+                      "title": "ShellEnvironment",
+                      "description": "A key/value mapping of the environment variables, if any, to use when running the configured process.",
+                      "additionalProperties": true
+                    }
+                  },
+                  "required": [
+                    "command"
+                  ]
+                }
+              },
+              "required": [
+                "shell"
+              ],
+              "type": "object"
+            },
+            {
+              "title": "RunWorkflow",
+              "description": "Enables the invocation and execution of nested workflows within a parent workflow, facilitating modularization, reusability, and abstraction of complex logic or business processes by encapsulating them into standalone workflow units.",
+              "properties": {
+                "workflow": {
+                  "type": "object",
+                  "title": "SubflowConfiguration",
+                  "description": "The configuration of the workflow to run.",
+                  "unevaluatedProperties": false,
+                  "properties": {
+                    "namespace": {
+                      "type": "string",
+                      "description": "The namespace the workflow to run belongs to."
+                    },
+                    "name": {
+                      "type": "string",
+                      "description": "The name of the workflow to run."
+                    },
+                    "version": {
+                      "type": "string",
+                      "default": "latest",
+                      "description": "The version of the workflow to run. Defaults to latest."
+                    },
+                    "input": {
+                      "type": "object",
+                      "title": "SubflowInput",
+                      "description": "The data, if any, to pass as input to the workflow to execute. The value should be validated against the target workflow's input schema, if specified.",
+                      "additionalProperties": true
+                    }
+                  },
+                  "required": [
+                    "namespace",
+                    "name",
+                    "version"
+                  ]
+                }
+              },
+              "required": [
+                "workflow"
+              ],
+              "type": "object"
+            }
+          ]
+        }
+      }
+    },
+    "setTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "SetTask",
+      "description": "A task used to set data.",
+      "required": [
+        "set"
+      ],
+      "unevaluatedProperties": false,
+      "properties": {
+        "set": {
+          "type": "object",
+          "title": "SetTaskConfiguration",
+          "description": "The data to set.",
+          "minProperties": 1,
+          "additionalProperties": true
+        }
+      }
+    },
+    "switchTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "SwitchTask",
+      "description": "Enables conditional branching within workflows, allowing them to dynamically select different paths based on specified conditions or criteria.",
+      "required": [
+        "switch"
+      ],
+      "unevaluatedProperties": false,
+      "properties": {
+        "switch": {
+          "type": "array",
+          "title": "SwitchTaskConfiguration",
+          "description": "The definition of the switch to use.",
+          "minItems": 1,
+          "items": {
+            "type": "object",
+            "title": "SwitchItem",
+            "minProperties": 1,
+            "maxProperties": 1,
+            "additionalProperties": {
+              "type": "object",
+              "title": "SwitchCase",
+              "description": "The definition of a case within a switch task, defining a condition and corresponding tasks to execute if the condition is met.",
+              "unevaluatedProperties": false,
+              "required": [
+                "then"
+              ],
+              "properties": {
+                "when": {
+                  "type": "string",
+                  "description": "A runtime expression used to determine whether or not the case matches."
+                },
+                "then": {
+                  "$ref": "#/$defs/flowDirective",
+                  "title": "SwitchCaseOutcome",
+                  "description": "The flow directive to execute when the case matches.",
+                  "type": "object"
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "tryTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "TryTask",
+      "description": "Serves as a mechanism within workflows to handle errors gracefully, potentially retrying failed tasks before proceeding with alternate ones.",
+      "required": [
+        "try",
+        "catch"
+      ],
+      "unevaluatedProperties": false,
+      "properties": {
+        "try": {
+          "$ref": "#/$defs/taskList",
+          "title": "TryTaskConfiguration",
+          "description": "The task(s) to perform.",
+          "type": "object"
+        },
+        "catch": {
+          "type": "object",
+          "title": "TryTaskCatch",
+          "description": "The object used to define the errors to catch.",
+          "unevaluatedProperties": false,
+          "properties": {
+            "errors": {
+              "type": "object",
+              "title": "CatchErrors",
+              "properties": {
+                "with": {
+                  "$ref": "#/$defs/errorFilter",
+                  "type": "object",
+                  "title": "CatchErrorsWith"
+                }
+              },
+              "description": "static error filter"
+            },
+            "as": {
+              "type": "string",
+              "description": "The name of the runtime expression variable to save the error as. Defaults to 'error'."
+            },
+            "when": {
+              "type": "string",
+              "description": "A runtime expression used to determine whether to catch the filtered error."
+            },
+            "exceptWhen": {
+              "type": "string",
+              "description": "A runtime expression used to determine whether not to catch the filtered error."
+            },
+            "retry": {
+              "oneOf": [
+                {
+                  "$ref": "#/$defs/retryPolicy",
+                  "title": "RetryPolicyDefinition",
+                  "description": "The retry policy to use, if any, when catching errors.",
+                  "type": "object"
+                },
+                {
+                  "type": "string",
+                  "description": "The name of the retry policy to use, if any, when catching errors."
+                }
+              ],
+              "title": "TryTaskCatchRetry"
+            },
+            "do": {
+              "$ref": "#/$defs/taskList",
+              "title": "TryTaskCatchDo",
+              "description": "The definition of the task(s) to run when catching an error.",
+              "type": "object"
+            }
+          }
+        }
+      }
+    },
+    "waitTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "WaitTask",
+      "description": "Allows workflows to pause or delay their execution for a specified period of time.",
+      "required": [
+        "wait"
+      ],
+      "unevaluatedProperties": false,
+      "properties": {
+        "wait": {
+          "$ref": "#/$defs/duration",
+          "title": "WaitTaskConfiguration",
+          "description": "The amount of time to wait.",
+          "type": "object"
+        }
+      }
+    },
+    "flowDirective": {
+      "title": "FlowDirective",
+      "description": "Represents different transition options for a workflow.",
+      "anyOf": [
+        {
+          "type": "string",
+          "enum": [
+            "continue",
+            "exit",
+            "end"
+          ],
+          "default": "continue"
+        },
+        {
+          "type": "string"
+        }
+      ]
+    },
+    "referenceableAuthenticationPolicy": {
+      "type": "object",
+      "title": "ReferenceableAuthenticationPolicy",
+      "description": "Represents a referenceable authentication policy.",
+      "unevaluatedProperties": false,
+      "oneOf": [
+        {
+          "title": "AuthenticationPolicyReference",
+          "description": "The reference of the authentication policy to use.",
+          "properties": {
+            "use": {
+              "type": "string",
+              "minLength": 1,
+              "description": "The name of the authentication policy to use."
+            }
+          },
+          "required": [
+            "use"
+          ],
+          "type": "object"
+        },
+        {
+          "$ref": "#/$defs/authenticationPolicy",
+          "type": "object"
+        }
+      ]
+    },
+    "secretBasedAuthenticationPolicy": {
+      "type": "object",
+      "title": "SecretBasedAuthenticationPolicy",
+      "description": "Represents an authentication policy based on secrets.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "use": {
+          "type": "string",
+          "minLength": 1,
+          "description": "The name of the authentication policy to use."
+        }
+      },
+      "required": [
+        "use"
+      ]
+    },
+    "authenticationPolicy": {
+      "type": "object",
+      "title": "AuthenticationPolicy",
+      "description": "Defines an authentication policy.",
+      "oneOf": [
+        {
+          "title": "BasicAuthenticationPolicy",
+          "description": "Use basic authentication.",
+          "properties": {
+            "basic": {
+              "type": "object",
+              "title": "BasicAuthenticationPolicyConfiguration",
+              "description": "The configuration of the basic authentication policy.",
+              "unevaluatedProperties": false,
+              "oneOf": [
+                {
+                  "title": "BasicAuthenticationProperties",
+                  "description": "Inline configuration of the basic authentication policy.",
+                  "properties": {
+                    "username": {
+                      "type": "string",
+                      "description": "The username to use."
+                    },
+                    "password": {
+                      "type": "string",
+                      "description": "The password to use."
+                    }
+                  },
+                  "required": [
+                    "username",
+                    "password"
+                  ],
+                  "type": "object"
+                },
+                {
+                  "$ref": "#/$defs/secretBasedAuthenticationPolicy",
+                  "title": "BasicAuthenticationPolicySecret",
+                  "description": "Secret based configuration of the basic authentication policy.",
+                  "type": "object"
+                }
+              ]
+            }
+          },
+          "required": [
+            "basic"
+          ],
+          "type": "object"
+        },
+        {
+          "title": "BearerAuthenticationPolicy",
+          "description": "Use bearer authentication.",
+          "properties": {
+            "bearer": {
+              "type": "object",
+              "title": "BearerAuthenticationPolicyConfiguration",
+              "description": "The configuration of the bearer authentication policy.",
+              "unevaluatedProperties": false,
+              "oneOf": [
+                {
+                  "title": "BearerAuthenticationProperties",
+                  "description": "Inline configuration of the bearer authentication policy.",
+                  "properties": {
+                    "token": {
+                      "type": "string",
+                      "description": "The bearer token to use."
+                    }
+                  },
+                  "required": [
+                    "token"
+                  ],
+                  "type": "object"
+                },
+                {
+                  "$ref": "#/$defs/secretBasedAuthenticationPolicy",
+                  "title": "BearerAuthenticationPolicySecret",
+                  "description": "Secret based configuration of the bearer authentication policy.",
+                  "type": "object"
+                }
+              ]
+            }
+          },
+          "required": [
+            "bearer"
+          ],
+          "type": "object"
+        },
+        {
+          "title": "DigestAuthenticationPolicy",
+          "description": "Use digest authentication.",
+          "properties": {
+            "digest": {
+              "type": "object",
+              "title": "DigestAuthenticationPolicyConfiguration",
+              "description": "The configuration of the digest authentication policy.",
+              "unevaluatedProperties": false,
+              "oneOf": [
+                {
+                  "title": "DigestAuthenticationProperties",
+                  "description": "Inline configuration of the digest authentication policy.",
+                  "properties": {
+                    "username": {
+                      "type": "string",
+                      "description": "The username to use."
+                    },
+                    "password": {
+                      "type": "string",
+                      "description": "The password to use."
+                    }
+                  },
+                  "required": [
+                    "username",
+                    "password"
+                  ],
+                  "type": "object"
+                },
+                {
+                  "$ref": "#/$defs/secretBasedAuthenticationPolicy",
+                  "title": "DigestAuthenticationPolicySecret",
+                  "description": "Secret based configuration of the digest authentication policy.",
+                  "type": "object"
+                }
+              ]
+            }
+          },
+          "required": [
+            "digest"
+          ],
+          "type": "object"
+        },
+        {
+          "title": "OAuth2AuthenticationPolicy",
+          "description": "Use OAuth2 authentication.",
+          "properties": {
+            "oauth2": {
+              "type": "object",
+              "title": "OAuth2AuthenticationPolicyConfiguration",
+              "description": "The configuration of the OAuth2 authentication policy.",
+              "unevaluatedProperties": false,
+              "oneOf": [
+                {
+                  "type": "object",
+                  "title": "OAuth2ConnectAuthenticationProperties",
+                  "description": "The inline configuration of the OAuth2 authentication policy.",
+                  "unevaluatedProperties": false,
+                  "allOf": [
+                    {
+                      "$ref": "#/$defs/oauth2AuthenticationProperties",
+                      "type": "object"
+                    },
+                    {
+                      "type": "object",
+                      "properties": {
+                        "endpoints": {
+                          "type": "object",
+                          "title": "OAuth2AuthenticationPropertiesEndpoints",
+                          "description": "The endpoint configurations for OAuth2.",
+                          "properties": {
+                            "token": {
+                              "type": "string",
+                              "format": "uri-template",
+                              "default": "/oauth2/token",
+                              "description": "The relative path to the token endpoint. Defaults to `/oauth2/token`."
+                            },
+                            "revocation": {
+                              "type": "string",
+                              "format": "uri-template",
+                              "default": "/oauth2/revoke",
+                              "description": "The relative path to the revocation endpoint. Defaults to `/oauth2/revoke`."
+                            },
+                            "introspection": {
+                              "type": "string",
+                              "format": "uri-template",
+                              "default": "/oauth2/introspect",
+                              "description": "The relative path to the introspection endpoint. Defaults to `/oauth2/introspect`."
+                            }
+                          }
+                        }
+                      }
+                    }
+                  ]
+                },
+                {
+                  "$ref": "#/$defs/secretBasedAuthenticationPolicy",
+                  "title": "OAuth2AuthenticationPolicySecret",
+                  "description": "Secret based configuration of the OAuth2 authentication policy.",
+                  "type": "object"
+                }
+              ]
+            }
+          },
+          "required": [
+            "oauth2"
+          ],
+          "type": "object"
+        },
+        {
+          "title": "OpenIdConnectAuthenticationPolicy",
+          "description": "Use OpenIdConnect authentication.",
+          "properties": {
+            "oidc": {
+              "type": "object",
+              "title": "OpenIdConnectAuthenticationPolicyConfiguration",
+              "description": "The configuration of the OpenIdConnect authentication policy.",
+              "unevaluatedProperties": false,
+              "oneOf": [
+                {
+                  "$ref": "#/$defs/oauth2AuthenticationProperties",
+                  "title": "OpenIdConnectAuthenticationProperties",
+                  "description": "The inline configuration of the OpenIdConnect authentication policy.",
+                  "unevaluatedProperties": false,
+                  "type": "object",
+                  "$id": "OpenIdConnectAuthenticationProperties"
+                },
+                {
+                  "$ref": "#/$defs/secretBasedAuthenticationPolicy",
+                  "title": "OpenIdConnectAuthenticationPolicySecret",
+                  "description": "Secret based configuration of the OpenIdConnect authentication policy.",
+                  "type": "object"
+                }
+              ]
+            }
+          },
+          "required": [
+            "oidc"
+          ],
+          "type": "object"
+        }
+      ]
+    },
+    "oauth2AuthenticationProperties": {
+      "type": "object",
+      "title": "OAuth2AutenthicationData",
+      "description": "Inline configuration of the OAuth2 authentication policy.",
+      "properties": {
+        "authority": {
+          "$ref": "#/$defs/uriTemplate",
+          "title": "OAuth2AutenthicationDataAuthority",
+          "description": "The URI that references the OAuth2 authority to use.",
+          "type": "object"
+        },
+        "grant": {
+          "type": "string",
+          "enum": [
+            "authorization_code",
+            "client_credentials",
+            "password",
+            "refresh_token",
+            "urn:ietf:params:oauth:grant-type:token-exchange"
+          ],
+          "description": "The grant type to use."
+        },
+        "client": {
+          "type": "object",
+          "title": "OAuth2AutenthicationDataClient",
+          "description": "The definition of an OAuth2 client.",
+          "unevaluatedProperties": false,
+          "properties": {
+            "id": {
+              "type": "string",
+              "description": "The client id to use."
+            },
+            "secret": {
+              "type": "string",
+              "description": "The client secret to use, if any."
+            },
+            "assertion": {
+              "type": "string",
+              "description": "A JWT containing a signed assertion with your application credentials."
+            },
+            "authentication": {
+              "type": "string",
+              "enum": [
+                "client_secret_basic",
+                "client_secret_post",
+                "client_secret_jwt",
+                "private_key_jwt",
+                "none"
+              ],
+              "default": "client_secret_post",
+              "description": "The authentication method to use to authenticate the client."
+            }
+          }
+        },
+        "request": {
+          "type": "object",
+          "title": "OAuth2TokenRequest",
+          "description": "The configuration of an OAuth2 token request",
+          "properties": {
+            "encoding": {
+              "type": "string",
+              "enum": [
+                "application/x-www-form-urlencoded",
+                "application/json"
+              ],
+              "default": "application/x-www-form-urlencoded"
+            }
+          }
+        },
+        "issuers": {
+          "type": "array",
+          "title": "OAuth2Issuers",
+          "description": "A list that contains that contains valid issuers that will be used to check against the issuer of generated tokens.",
+          "items": {
+            "type": "string"
+          }
+        },
+        "scopes": {
+          "type": "array",
+          "title": "OAuth2AutenthicationDataScopes",
+          "description": "The scopes, if any, to request the token for.",
+          "items": {
+            "type": "string"
+          }
+        },
+        "audiences": {
+          "type": "array",
+          "title": "OAuth2AutenthicationDataAudiences",
+          "description": "The audiences, if any, to request the token for.",
+          "items": {
+            "type": "string"
+          }
+        },
+        "username": {
+          "type": "string",
+          "description": "The username to use. Used only if the grant type is Password."
+        },
+        "password": {
+          "type": "string",
+          "description": "The password to use. Used only if the grant type is Password."
+        },
+        "subject": {
+          "$ref": "#/$defs/oauth2Token",
+          "title": "OAuth2AutenthicationDataSubject",
+          "description": "The security token that represents the identity of the party on behalf of whom the request is being made.",
+          "type": "object"
+        },
+        "actor": {
+          "$ref": "#/$defs/oauth2Token",
+          "title": "OAuth2AutenthicationDataActor",
+          "description": "The security token that represents the identity of the acting party.",
+          "type": "object"
+        }
+      }
+    },
+    "oauth2Token": {
+      "type": "object",
+      "title": "OAuth2TokenDefinition",
+      "description": "Represents an OAuth2 token.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "token": {
+          "type": "string",
+          "description": "The security token to use."
+        },
+        "type": {
+          "type": "string",
+          "description": "The type of the security token to use."
+        }
+      },
+      "required": [
+        "token",
+        "type"
+      ]
+    },
+    "duration": {
+      "oneOf": [
+        {
+          "type": "object",
+          "minProperties": 1,
+          "unevaluatedProperties": false,
+          "properties": {
+            "days": {
+              "type": "integer",
+              "description": "Number of days, if any."
+            },
+            "hours": {
+              "type": "integer",
+              "description": "Number of days, if any."
+            },
+            "minutes": {
+              "type": "integer",
+              "description": "Number of minutes, if any."
+            },
+            "seconds": {
+              "type": "integer",
+              "description": "Number of seconds, if any."
+            },
+            "milliseconds": {
+              "type": "integer",
+              "description": "Number of milliseconds, if any."
+            }
+          },
+          "title": "DurationInline",
+          "description": "The inline definition of a duration."
+        },
+        {
+          "type": "string",
+          "pattern": "^P(?!$)(\\d+(?:\\.\\d+)?Y)?(\\d+(?:\\.\\d+)?M)?(\\d+(?:\\.\\d+)?W)?(\\d+(?:\\.\\d+)?D)?(T(?=\\d)(\\d+(?:\\.\\d+)?H)?(\\d+(?:\\.\\d+)?M)?(\\d+(?:\\.\\d+)?S)?)?$",
+          "description": "The ISO 8601 expression of a duration."
+        }
+      ],
+      "title": "Duration"
+    },
+    "error": {
+      "type": "object",
+      "title": "Error",
+      "description": "Represents an error.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "type": {
+          "title": "ErrorType",
+          "description": "A URI reference that identifies the error type.",
+          "oneOf": [
+            {
+              "title": "LiteralErrorType",
+              "$ref": "#/$defs/uriTemplate",
+              "description": "The literal error type.",
+              "type": "object"
+            },
+            {
+              "title": "ExpressionErrorType",
+              "$ref": "#/$defs/runtimeExpression",
+              "description": "An expression based error type.",
+              "type": "object"
+            }
+          ]
+        },
+        "status": {
+          "type": "integer",
+          "description": "The status code generated by the origin for this occurrence of the error."
+        },
+        "instance": {
+          "title": "ErrorInstance",
+          "description": "A JSON Pointer used to reference the component the error originates from.",
+          "oneOf": [
+            {
+              "description": "The literal error instance.",
+              "type": "string",
+              "format": "json-pointer"
+            },
+            {
+              "$ref": "#/$defs/runtimeExpression",
+              "title": "ExpressionErrorInstance",
+              "description": "An expression based error instance.",
+              "type": "object"
+            }
+          ]
+        },
+        "title": {
+          "type": "string",
+          "description": "A short, human-readable summary of the error."
+        },
+        "detail": {
+          "type": "string",
+          "description": "A human-readable explanation specific to this occurrence of the error."
+        }
+      },
+      "required": [
+        "type",
+        "status"
+      ]
+    },
+    "errorFilter": {
+      "type": "object",
+      "title": "ErrorFilter",
+      "description": "Error filtering base on static values. For error filtering on dynamic values, use catch.when property",
+      "minProperties": 1,
+      "properties": {
+        "type": {
+          "type": "string",
+          "description": "if present, means this value should be used for filtering"
+        },
+        "status": {
+          "type": "integer",
+          "description": "if present, means this value should be used for filtering"
+        },
+        "instance": {
+          "type": "string",
+          "description": "if present, means this value should be used for filtering"
+        },
+        "title": {
+          "type": "string",
+          "description": "if present, means this value should be used for filtering"
+        },
+        "details": {
+          "type": "string",
+          "description": "if present, means this value should be used for filtering"
+        }
+      }
+    },
+    "uriTemplate": {
+      "title": "UriTemplate",
+      "anyOf": [
+        {
+          "type": "string",
+          "format": "uri-template",
+          "pattern": "^[A-Za-z][A-Za-z0-9+\\-.]*://.*"
+        },
+        {
+          "type": "string",
+          "format": "uri",
+          "pattern": "^[A-Za-z][A-Za-z0-9+\\-.]*://.*"
+        }
+      ]
+    },
+    "endpoint": {
+      "title": "Endpoint",
+      "description": "Represents an endpoint.",
+      "oneOf": [
+        {
+          "$ref": "#/$defs/runtimeExpression",
+          "type": "object"
+        },
+        {
+          "$ref": "#/$defs/uriTemplate",
+          "type": "object"
+        },
+        {
+          "title": "EndpointConfiguration",
+          "type": "object",
+          "unevaluatedProperties": false,
+          "properties": {
+            "uri": {
+              "title": "EndpointUri",
+              "description": "The endpoint's URI.",
+              "oneOf": [
+                {
+                  "title": "LiteralEndpointURI",
+                  "description": "The literal endpoint's URI.",
+                  "$ref": "#/$defs/uriTemplate",
+                  "type": "object"
+                },
+                {
+                  "title": "ExpressionEndpointURI",
+                  "$ref": "#/$defs/runtimeExpression",
+                  "description": "An expression based endpoint's URI.",
+                  "type": "object"
+                }
+              ]
+            },
+            "authentication": {
+              "$ref": "#/$defs/referenceableAuthenticationPolicy",
+              "title": "EndpointAuthentication",
+              "description": "The authentication policy to use.",
+              "type": "object"
+            }
+          },
+          "required": [
+            "uri"
+          ]
+        }
+      ]
+    },
+    "eventProperties": {
+      "type": "object",
+      "title": "EventProperties",
+      "description": "Describes the properties of an event.",
+      "properties": {
+        "id": {
+          "type": "string",
+          "description": "The event's unique identifier."
+        },
+        "source": {
+          "title": "EventSource",
+          "description": "Identifies the context in which an event happened.",
+          "oneOf": [
+            {
+              "$ref": "#/$defs/uriTemplate",
+              "type": "object"
+            },
+            {
+              "$ref": "#/$defs/runtimeExpression",
+              "type": "object"
+            }
+          ]
+        },
+        "type": {
+          "type": "string",
+          "description": "This attribute contains a value describing the type of event related to the originating occurrence."
+        },
+        "time": {
+          "title": "EventTime",
+          "description": "When the event occured.",
+          "oneOf": [
+            {
+              "type": "string",
+              "format": "date-time"
+            },
+            {
+              "$ref": "#/$defs/runtimeExpression",
+              "type": "object"
+            }
+          ]
+        },
+        "subject": {
+          "type": "string",
+          "description": "The subject of the event."
+        },
+        "datacontenttype": {
+          "type": "string",
+          "description": "Content type of data value. This attribute enables data to carry any type of content, whereby format and encoding might differ from that of the chosen event format."
+        },
+        "dataschema": {
+          "title": "EventDataschema",
+          "description": "The schema describing the event format.",
+          "oneOf": [
+            {
+              "title": "LiteralDataSchema",
+              "$ref": "#/$defs/uriTemplate",
+              "description": "The literal event data schema.",
+              "type": "object"
+            },
+            {
+              "title": "ExpressionDataSchema",
+              "$ref": "#/$defs/runtimeExpression",
+              "description": "An expression based event data schema.",
+              "type": "object"
+            }
+          ]
+        },
+        "data": {
+          "title": "EventData",
+          "description": "The event's payload data",
+          "anyOf": [
+            {
+              "$ref": "#/$defs/runtimeExpression",
+              "type": "object"
+            },
+            {
+              "type": "object"
+            }
+          ]
+        }
+      },
+      "additionalProperties": true
+    },
+    "eventConsumptionStrategy": {
+      "type": "object",
+      "title": "EventConsumptionStrategy",
+      "description": "Describe the event consumption strategy to adopt.",
+      "unevaluatedProperties": false,
+      "oneOf": [
+        {
+          "title": "AllEventConsumptionStrategy",
+          "properties": {
+            "all": {
+              "type": "array",
+              "title": "AllEventConsumptionStrategyConfiguration",
+              "description": "A list containing all the events that must be consumed.",
+              "items": {
+                "$ref": "#/$defs/eventFilter"
+              }
+            }
+          },
+          "required": [
+            "all"
+          ],
+          "type": "object"
+        },
+        {
+          "title": "AnyEventConsumptionStrategy",
+          "properties": {
+            "any": {
+              "type": "array",
+              "title": "AnyEventConsumptionStrategyConfiguration",
+              "description": "A list containing any of the events to consume.",
+              "items": {
+                "$ref": "#/$defs/eventFilter"
+              }
+            },
+            "until": {
+              "oneOf": [
+                {
+                  "type": "string",
+                  "description": "A runtime expression condition evaluated after consuming an event and which determines whether or not to continue listening."
+                },
+                {
+                  "allOf": [
+                    {
+                      "$ref": "#/$defs/eventConsumptionStrategy",
+                      "description": "The strategy that defines the event(s) to consume to stop listening.",
+                      "type": "object"
+                    },
+                    {
+                      "properties": {
+                        "until": false
+                      },
+                      "type": "object"
+                    }
+                  ],
+                  "title": "AnyEventUntilConsumed"
+                }
+              ],
+              "title": "AnyEventConsumptionStrategyUntil"
+            }
+          },
+          "required": [
+            "any"
+          ],
+          "type": "object"
+        },
+        {
+          "title": "OneEventConsumptionStrategy",
+          "properties": {
+            "one": {
+              "$ref": "#/$defs/eventFilter",
+              "title": "OneEventConsumptionStrategyConfiguration",
+              "description": "The single event to consume.",
+              "type": "object"
+            }
+          },
+          "required": [
+            "one"
+          ],
+          "type": "object"
+        }
+      ]
+    },
+    "eventFilter": {
+      "type": "object",
+      "title": "EventFilter",
+      "description": "An event filter is a mechanism used to selectively process or handle events based on predefined criteria, such as event type, source, or specific attributes.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "with": {
+          "$ref": "#/$defs/eventProperties",
+          "minProperties": 1,
+          "title": "WithEvent",
+          "description": "An event filter is a mechanism used to selectively process or handle events based on predefined criteria, such as event type, source, or specific attributes.",
+          "type": "object"
+        },
+        "correlate": {
+          "type": "object",
+          "title": "EventFilterCorrelate",
+          "description": "A correlation is a link between events and data, established by mapping event attributes to specific data attributes, allowing for coordinated processing or handling based on event characteristics.",
+          "additionalProperties": {
+            "type": "object",
+            "properties": {
+              "from": {
+                "type": "string",
+                "description": "A runtime expression used to extract the correlation value from the filtered event."
+              },
+              "expect": {
+                "type": "string",
+                "description": "A constant or a runtime expression, if any, used to determine whether or not the extracted correlation value matches expectations. If not set, the first extracted value will be used as the correlation's expectation."
+              }
+            },
+            "required": [
+              "from"
+            ]
+          }
+        }
+      },
+      "required": [
+        "with"
+      ]
+    },
+    "extension": {
+      "type": "object",
+      "title": "Extension",
+      "description": "The definition of an extension.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "extend": {
+          "type": "string",
+          "enum": [
+            "call",
+            "composite",
+            "emit",
+            "for",
+            "listen",
+            "raise",
+            "run",
+            "set",
+            "switch",
+            "try",
+            "wait",
+            "all"
+          ],
+          "description": "The type of task to extend."
+        },
+        "when": {
+          "type": "string",
+          "description": "A runtime expression, if any, used to determine whether or not the extension should apply in the specified context."
+        },
+        "before": {
+          "$ref": "#/$defs/taskList",
+          "title": "ExtensionDoBefore",
+          "description": "The task(s) to execute before the extended task, if any.",
+          "type": "object"
+        },
+        "after": {
+          "$ref": "#/$defs/taskList",
+          "title": "ExtensionDoAfter",
+          "description": "The task(s) to execute after the extended task, if any.",
+          "type": "object"
+        }
+      },
+      "required": [
+        "extend"
+      ]
+    },
+    "externalResource": {
+      "type": "object",
+      "title": "ExternalResource",
+      "description": "Represents an external resource.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "name": {
+          "type": "string",
+          "description": "The name of the external resource, if any."
+        },
+        "endpoint": {
+          "$ref": "#/$defs/endpoint",
+          "title": "ExternalResourceEndpoint",
+          "description": "The endpoint of the external resource.",
+          "type": "object"
+        }
+      },
+      "required": [
+        "endpoint"
+      ]
+    },
+    "input": {
+      "type": "object",
+      "title": "Input",
+      "description": "Configures the input of a workflow or task.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "schema": {
+          "$ref": "#/$defs/schema",
+          "title": "InputSchema",
+          "description": "The schema used to describe and validate the input of the workflow or task.",
+          "type": "object"
+        },
+        "from": {
+          "title": "InputFrom",
+          "description": "A runtime expression, if any, used to mutate and/or filter the input of the workflow or task.",
+          "oneOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "object"
+            }
+          ]
+        }
+      }
+    },
+    "output": {
+      "type": "object",
+      "title": "Output",
+      "description": "Configures the output of a workflow or task.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "schema": {
+          "$ref": "#/$defs/schema",
+          "title": "OutputSchema",
+          "description": "The schema used to describe and validate the output of the workflow or task.",
+          "type": "object"
+        },
+        "as": {
+          "title": "OutputAs",
+          "description": "A runtime expression, if any, used to mutate and/or filter the output of the workflow or task.",
+          "oneOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "object"
+            }
+          ]
+        }
+      }
+    },
+    "export": {
+      "type": "object",
+      "title": "Export",
+      "description": "Set the content of the context. .",
+      "unevaluatedProperties": false,
+      "properties": {
+        "schema": {
+          "$ref": "#/$defs/schema",
+          "title": "ExportSchema",
+          "description": "The schema used to describe and validate the workflow context.",
+          "type": "object"
+        },
+        "as": {
+          "title": "ExportAs",
+          "description": "A runtime expression, if any, used to export the output data to the context.",
+          "oneOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "object"
+            }
+          ]
+        }
+      }
+    },
+    "retryPolicy": {
+      "type": "object",
+      "title": "RetryPolicy",
+      "description": "Defines a retry policy.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "when": {
+          "type": "string",
+          "description": "A runtime expression, if any, used to determine whether or not to retry running the task, in a given context."
+        },
+        "exceptWhen": {
+          "type": "string",
+          "description": "A runtime expression used to determine whether or not to retry running the task, in a given context."
+        },
+        "delay": {
+          "$ref": "#/$defs/duration",
+          "title": "RetryDelay",
+          "description": "The duration to wait between retry attempts.",
+          "type": "object"
+        },
+        "backoff": {
+          "type": "object",
+          "title": "RetryBackoff",
+          "description": "The retry duration backoff.",
+          "unevaluatedProperties": false,
+          "oneOf": [
+            {
+              "title": "ConstantBackoff",
+              "properties": {
+                "constant": {
+                  "type": "object",
+                  "description": "The definition of the constant backoff to use, if any."
+                }
+              },
+              "required": [
+                "constant"
+              ],
+              "type": "object"
+            },
+            {
+              "title": "ExponentialBackOff",
+              "properties": {
+                "exponential": {
+                  "type": "object",
+                  "description": "The definition of the exponential backoff to use, if any."
+                }
+              },
+              "required": [
+                "exponential"
+              ],
+              "type": "object"
+            },
+            {
+              "title": "LinearBackoff",
+              "properties": {
+                "linear": {
+                  "type": "object",
+                  "description": "The definition of the linear backoff to use, if any."
+                }
+              },
+              "required": [
+                "linear"
+              ],
+              "type": "object"
+            }
+          ]
+        },
+        "limit": {
+          "type": "object",
+          "title": "RetryLimit",
+          "unevaluatedProperties": false,
+          "properties": {
+            "attempt": {
+              "type": "object",
+              "title": "RetryLimitAttempt",
+              "unevaluatedProperties": false,
+              "properties": {
+                "count": {
+                  "type": "integer",
+                  "description": "The maximum amount of retry attempts, if any."
+                },
+                "duration": {
+                  "$ref": "#/$defs/duration",
+                  "title": "RetryLimitAttemptDuration",
+                  "description": "The maximum duration for each retry attempt.",
+                  "type": "object"
+                }
+              }
+            },
+            "duration": {
+              "$ref": "#/$defs/duration",
+              "title": "RetryLimitDuration",
+              "description": "The duration limit, if any, for all retry attempts.",
+              "type": "object"
+            }
+          },
+          "description": "The retry limit, if any."
+        },
+        "jitter": {
+          "type": "object",
+          "title": "RetryPolicyJitter",
+          "description": "The parameters, if any, that control the randomness or variability of the delay between retry attempts.",
+          "unevaluatedProperties": false,
+          "properties": {
+            "from": {
+              "$ref": "#/$defs/duration",
+              "title": "RetryPolicyJitterFrom",
+              "description": "The minimum duration of the jitter range.",
+              "type": "object"
+            },
+            "to": {
+              "$ref": "#/$defs/duration",
+              "title": "RetryPolicyJitterTo",
+              "description": "The maximum duration of the jitter range.",
+              "type": "object"
+            }
+          },
+          "required": [
+            "from",
+            "to"
+          ]
+        }
+      }
+    },
+    "schema": {
+      "type": "object",
+      "title": "Schema",
+      "description": "Represents the definition of a schema.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "format": {
+          "type": "string",
+          "default": "json",
+          "description": "The schema's format. Defaults to 'json'. The (optional) version of the format can be set using `{format}:{version}`."
+        }
+      },
+      "oneOf": [
+        {
+          "title": "SchemaInline",
+          "properties": {
+            "document": {
+              "description": "The schema's inline definition.",
+              "type": "object"
+            }
+          },
+          "required": [
+            "document"
+          ],
+          "type": "object"
+        },
+        {
+          "title": "SchemaExternal",
+          "properties": {
+            "resource": {
+              "$ref": "#/$defs/externalResource",
+              "title": "SchemaExternalResource",
+              "description": "The schema's external resource.",
+              "type": "object"
+            }
+          },
+          "required": [
+            "resource"
+          ],
+          "type": "object"
+        }
+      ]
+    },
+    "timeout": {
+      "type": "object",
+      "title": "Timeout",
+      "description": "The definition of a timeout.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "after": {
+          "$ref": "#/$defs/duration",
+          "title": "TimeoutAfter",
+          "description": "The duration after which to timeout.",
+          "type": "object"
+        }
+      },
+      "required": [
+        "after"
+      ]
+    },
+    "catalog": {
+      "type": "object",
+      "title": "Catalog",
+      "description": "The definition of a resource catalog.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "endpoint": {
+          "$ref": "#/$defs/endpoint",
+          "title": "CatalogEndpoint",
+          "description": "The root URL where the catalog is hosted.",
+          "type": "object"
+        }
+      },
+      "required": [
+        "endpoint"
+      ]
+    },
+    "runtimeExpression": {
+      "type": "string",
+      "title": "RuntimeExpression",
+      "description": "A runtime expression.",
+      "pattern": "^\\s*\\$\\{.+\\}\\s*$"
+    },
+    "containerLifetime": {
+      "type": "object",
+      "title": "ContainerLifetime",
+      "description": "The configuration of a container's lifetime",
+      "unevaluatedProperties": false,
+      "properties": {
+        "cleanup": {
+          "type": "string",
+          "description": "The container cleanup policy to use",
+          "enum": [
+            "always",
+            "never",
+            "eventually"
+          ],
+          "default": "never"
+        },
+        "after": {
+          "$ref": "#/$defs/duration",
+          "title": "ContainerLifetimeDuration",
+          "description": "The duration after which to cleanup the container, in case the cleanup policy has been set to 'eventually'",
+          "type": "object"
+        }
+      },
+      "required": [
+        "cleanup"
+      ],
+      "if": {
+        "properties": {
+          "cleanup": {
+            "const": "eventually",
+            "type": "object",
+            "title": "ContainerLifetimeCleanup"
+          }
+        }
+      },
+      "then": {
+        "required": [
+          "after"
+        ],
+        "type": "object",
+        "title": "ContainerLifetimeThen"
+      },
+      "else": {
+        "not": {
+          "required": [
+            "after"
+          ]
+        }
+      }
+    },
+    "processResult": {
+      "type": "object",
+      "title": "ProcessResult",
+      "description": "The object returned by a run task when its return type has been set 'all'.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "code": {
+          "type": "integer",
+          "description": "The process's exit code."
+        },
+        "stdout": {
+          "type": "string",
+          "description": "The content of the process's STDOUT."
+        },
+        "stderr": {
+          "type": "string",
+          "description": "The content of the process's STDERR."
+        }
+      },
+      "required": [
+        "code",
+        "stdout",
+        "stderr"
+      ]
+    },
+    "asyncApiServer": {
+      "type": "object",
+      "title": "AsyncApiServer",
+      "description": "Configures the target server of an AsyncAPI operation.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "name": {
+          "type": "string",
+          "description": "The target server's name."
+        },
+        "variables": {
+          "type": "object",
+          "title": "AsyncApiServerVariables",
+          "description": "The target server's variables, if any."
+        }
+      },
+      "required": [
+        "name"
+      ]
+    },
+    "asyncApiOutboundMessage": {
+      "type": "object",
+      "title": "AsyncApiOutboundMessage",
+      "description": "An object used to configure the message to publish using the target operation.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "payload": {
+          "type": "object",
+          "title": "AsyncApiMessagePayload",
+          "description": "The message's payload, if any.",
+          "additionalProperties": true
+        },
+        "headers": {
+          "type": "object",
+          "title": "AsyncApiMessageHeaders",
+          "description": "The message's headers, if any.",
+          "additionalProperties": true
+        }
+      }
+    },
+    "asyncApiInboundMessage": {
+      "type": "object",
+      "title": "AsyncApiInboundMessage",
+      "description": "Represents a message counsumed by an AsyncAPI subscription.",
+      "allOf": [
+        {
+          "$ref": "#/$defs/asyncApiOutboundMessage",
+          "type": "object"
+        }
+      ],
+      "properties": {
+        "correlationId": {
+          "type": "string",
+          "description": "The message's correlation id, if any."
+        }
+      }
+    },
+    "asyncApiSubscription": {
+      "type": "object",
+      "title": "AsyncApiSubscription",
+      "description": "An object used to configure the subscription to messages consumed using the target operation.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "filter": {
+          "$ref": "#/$defs/runtimeExpression",
+          "title": "AsyncApiSubscriptionCorrelation",
+          "description": "A runtime expression, if any, used to filter consumed messages.",
+          "type": "object"
+        },
+        "consume": {
+          "$ref": "#/$defs/asyncApiMessageConsumptionPolicy",
+          "title": "AsyncApiMessageConsumptionPolicy",
+          "description": "An object used to configure the subscription's message consumption policy.",
+          "type": "object"
+        },
+        "foreach": {
+          "$ref": "#/$defs/subscriptionIterator",
+          "title": "AsyncApiSubscriptionIterator",
+          "description": "Configures the iterator, if any, for processing consumed messages(s).",
+          "type": "object"
+        }
+      },
+      "required": [
+        "consume"
+      ]
+    },
+    "asyncApiMessageConsumptionPolicy": {
+      "type": "object",
+      "title": "AsyncApiMessageConsumptionPolicy",
+      "description": "An object used to configure a subscription's message consumption policy.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "for": {
+          "$ref": "#/$defs/duration",
+          "title": "AsyncApiMessageConsumptionPolicyFor",
+          "description": "Specifies the time period over which messages will be consumed.",
+          "type": "object"
+        }
+      },
+      "oneOf": [
+        {
+          "properties": {
+            "amount": {
+              "type": "integer",
+              "description": "The amount of (filtered) messages to consume before disposing of the subscription."
+            }
+          },
+          "title": "AsyncApiMessageConsumptionPolicyAmount",
+          "required": [
+            "amount"
+          ],
+          "type": "object"
+        },
+        {
+          "properties": {
+            "while": {
+              "$ref": "#/$defs/runtimeExpression",
+              "description": "A runtime expression evaluated after each consumed (filtered) message to decide if message consumption should continue.",
+              "type": "object",
+              "title": "AsyncApiMessageConsumptionPolicyWhileWhile"
+            }
+          },
+          "title": "AsyncApiMessageConsumptionPolicyWhile",
+          "required": [
+            "while"
+          ],
+          "type": "object"
+        },
+        {
+          "properties": {
+            "until": {
+              "$ref": "#/$defs/runtimeExpression",
+              "description": "A runtime expression evaluated before each consumed (filtered) message to decide if message consumption should continue.",
+              "type": "object",
+              "title": "AsyncApiMessageConsumptionPolicyUntilUntil"
+            }
+          },
+          "title": "AsyncApiMessageConsumptionPolicyUntil",
+          "required": [
+            "until"
+          ],
+          "type": "object"
+        }
+      ]
+    },
+    "subscriptionIterator": {
+      "type": "object",
+      "title": "SubscriptionIterator",
+      "description": "Configures the iteration over each item (event or message) consumed by a subscription.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "item": {
+          "type": "string",
+          "description": "The name of the variable used to store the current item being enumerated.",
+          "default": "item"
+        },
+        "at": {
+          "type": "string",
+          "description": "The name of the variable used to store the index of the current item being enumerated.",
+          "default": "index"
+        },
+        "do": {
+          "$ref": "#/$defs/taskList",
+          "title": "SubscriptionIteratorTasks",
+          "description": "The tasks to perform for each consumed item.",
+          "type": "object"
+        },
+        "output": {
+          "$ref": "#/$defs/output",
+          "title": "SubscriptionIteratorOutput",
+          "description": "An object, if any, used to customize the item's output and to document its schema.",
+          "type": "object"
+        },
+        "export": {
+          "$ref": "#/$defs/export",
+          "title": "SubscriptionIteratorExport",
+          "description": "An object, if any, used to customize the content of the workflow context.",
+          "type": "object"
+        }
+      }
+    }
+  },
+  "title": ""
+}
\ No newline at end of file
diff --git a/src/lib/generated/schema/workflow.json b/src/lib/generated/schema/workflow.json
new file mode 100644
index 00000000..8fc3565b
--- /dev/null
+++ b/src/lib/generated/schema/workflow.json
@@ -0,0 +1,2694 @@
+{
+  "$id": "https://serverlessworkflow.io/schemas/1.0.0/workflow.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "description": "Serverless Workflow DSL - Workflow Schema.",
+  "type": "object",
+  "required": [
+    "document",
+    "do"
+  ],
+  "properties": {
+    "document": {
+      "type": "object",
+      "title": "Document",
+      "description": "Documents the workflow.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "dsl": {
+          "type": "string",
+          "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$",
+          "title": "WorkflowDSL",
+          "description": "The version of the DSL used by the workflow."
+        },
+        "namespace": {
+          "type": "string",
+          "pattern": "^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$",
+          "title": "WorkflowNamespace",
+          "description": "The workflow's namespace."
+        },
+        "name": {
+          "type": "string",
+          "pattern": "^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$",
+          "title": "WorkflowName",
+          "description": "The workflow's name."
+        },
+        "version": {
+          "type": "string",
+          "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$",
+          "title": "WorkflowVersion",
+          "description": "The workflow's semantic version."
+        },
+        "title": {
+          "type": "string",
+          "title": "WorkflowTitle",
+          "description": "The workflow's title."
+        },
+        "summary": {
+          "type": "string",
+          "title": "WorkflowSummary",
+          "description": "The workflow's Markdown summary."
+        },
+        "tags": {
+          "type": "object",
+          "title": "WorkflowTags",
+          "description": "A key/value mapping of the workflow's tags, if any.",
+          "additionalProperties": true
+        },
+        "metadata": {
+          "type": "object",
+          "title": "WorkflowMetadata",
+          "description": "Holds additional information about the workflow.",
+          "additionalProperties": true
+        }
+      },
+      "required": [
+        "dsl",
+        "namespace",
+        "name",
+        "version"
+      ]
+    },
+    "input": {
+      "$ref": "#/$defs/input",
+      "title": "Input",
+      "description": "Configures the workflow's input."
+    },
+    "use": {
+      "type": "object",
+      "title": "Use",
+      "description": "Defines the workflow's reusable components.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "authentications": {
+          "type": "object",
+          "title": "UseAuthentications",
+          "description": "The workflow's reusable authentication policies.",
+          "additionalProperties": {
+            "$ref": "#/$defs/authenticationPolicy"
+          }
+        },
+        "errors": {
+          "type": "object",
+          "title": "UseErrors",
+          "description": "The workflow's reusable errors.",
+          "additionalProperties": {
+            "$ref": "#/$defs/error"
+          }
+        },
+        "extensions": {
+          "type": "array",
+          "title": "UseExtensions",
+          "description": "The workflow's extensions.",
+          "items": {
+            "type": "object",
+            "title": "ExtensionItem",
+            "minProperties": 1,
+            "maxProperties": 1,
+            "additionalProperties": {
+              "$ref": "#/$defs/extension"
+            }
+          }
+        },
+        "functions": {
+          "type": "object",
+          "title": "UseFunctions",
+          "description": "The workflow's reusable functions.",
+          "additionalProperties": {
+            "$ref": "#/$defs/task"
+          }
+        },
+        "retries": {
+          "type": "object",
+          "title": "UseRetries",
+          "description": "The workflow's reusable retry policies.",
+          "additionalProperties": {
+            "$ref": "#/$defs/retryPolicy"
+          }
+        },
+        "secrets": {
+          "type": "array",
+          "title": "UseSecrets",
+          "description": "The workflow's reusable secrets.",
+          "items": {
+            "type": "string",
+            "description": "The workflow's secrets."
+          }
+        },
+        "timeouts": {
+          "type": "object",
+          "title": "UseTimeouts",
+          "description": "The workflow's reusable timeouts.",
+          "additionalProperties": {
+            "$ref": "#/$defs/timeout"
+          }
+        },
+        "catalogs": {
+          "type": "object",
+          "title": "UseCatalogs",
+          "description": "The workflow's reusable catalogs.",
+          "additionalProperties": {
+            "$ref": "#/$defs/catalog"
+          }
+        }
+      }
+    },
+    "do": {
+      "$ref": "#/$defs/taskList",
+      "title": "Do",
+      "description": "Defines the task(s) the workflow must perform."
+    },
+    "timeout": {
+      "title": "DoTimeout",
+      "oneOf": [
+        {
+          "$ref": "#/$defs/timeout",
+          "title": "TimeoutDefinition",
+          "description": "The workflow's timeout configuration, if any."
+        },
+        {
+          "type": "string",
+          "title": "TimeoutReference",
+          "description": "The name of the workflow's timeout, if any."
+        }
+      ]
+    },
+    "output": {
+      "$ref": "#/$defs/output",
+      "title": "Output",
+      "description": "Configures the workflow's output."
+    },
+    "schedule": {
+      "type": "object",
+      "title": "Schedule",
+      "description": "Schedules the workflow.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "every": {
+          "$ref": "#/$defs/duration",
+          "title": "ScheduleEvery",
+          "description": "Specifies the duration of the interval at which the workflow should be executed."
+        },
+        "cron": {
+          "type": "string",
+          "title": "ScheduleCron",
+          "description": "Specifies the schedule using a cron expression, e.g., '0 0 * * *' for daily at midnight."
+        },
+        "after": {
+          "$ref": "#/$defs/duration",
+          "title": "ScheduleAfter",
+          "description": "Specifies a delay duration that the workflow must wait before starting again after it completes."
+        },
+        "on": {
+          "$ref": "#/$defs/eventConsumptionStrategy",
+          "title": "ScheduleOn",
+          "description": "Specifies the events that trigger the workflow execution."
+        }
+      }
+    }
+  },
+  "$defs": {
+    "taskList": {
+      "title": "TaskList",
+      "description": "List of named tasks to perform.",
+      "type": "array",
+      "items": {
+        "type": "object",
+        "title": "TaskItem",
+        "minProperties": 1,
+        "maxProperties": 1,
+        "additionalProperties": {
+          "$ref": "#/$defs/task"
+        }
+      }
+    },
+    "taskBase": {
+      "type": "object",
+      "title": "TaskBase",
+      "description": "An object inherited by all tasks.",
+      "properties": {
+        "if": {
+          "type": "string",
+          "title": "TaskBaseIf",
+          "description": "A runtime expression, if any, used to determine whether or not the task should be run."
+        },
+        "input": {
+          "$ref": "#/$defs/input",
+          "title": "TaskBaseInput",
+          "description": "Configure the task's input."
+        },
+        "output": {
+          "$ref": "#/$defs/output",
+          "title": "TaskBaseOutput",
+          "description": "Configure the task's output."
+        },
+        "export": {
+          "$ref": "#/$defs/export",
+          "title": "TaskBaseExport",
+          "description": "Export task output to context."
+        },
+        "timeout": {
+          "title": "TaskTimeout",
+          "oneOf": [
+            {
+              "$ref": "#/$defs/timeout",
+              "title": "TaskTimeoutDefinition",
+              "description": "The task's timeout configuration, if any."
+            },
+            {
+              "type": "string",
+              "title": "TaskTimeoutReference",
+              "description": "The name of the task's timeout, if any."
+            }
+          ]
+        },
+        "then": {
+          "$ref": "#/$defs/flowDirective",
+          "title": "TaskBaseThen",
+          "description": "The flow directive to be performed upon completion of the task."
+        },
+        "metadata": {
+          "type": "object",
+          "title": "TaskMetadata",
+          "description": "Holds additional information about the task.",
+          "additionalProperties": true
+        }
+      }
+    },
+    "task": {
+      "title": "Task",
+      "description": "A discrete unit of work that contributes to achieving the overall objectives defined by the workflow.",
+      "unevaluatedProperties": false,
+      "oneOf": [
+        {
+          "$ref": "#/$defs/callTask"
+        },
+        {
+          "$ref": "#/$defs/doTask"
+        },
+        {
+          "$ref": "#/$defs/forkTask"
+        },
+        {
+          "$ref": "#/$defs/emitTask"
+        },
+        {
+          "$ref": "#/$defs/forTask"
+        },
+        {
+          "$ref": "#/$defs/listenTask"
+        },
+        {
+          "$ref": "#/$defs/raiseTask"
+        },
+        {
+          "$ref": "#/$defs/runTask"
+        },
+        {
+          "$ref": "#/$defs/setTask"
+        },
+        {
+          "$ref": "#/$defs/switchTask"
+        },
+        {
+          "$ref": "#/$defs/tryTask"
+        },
+        {
+          "$ref": "#/$defs/waitTask"
+        }
+      ]
+    },
+    "callTask": {
+      "title": "CallTask",
+      "description": "Defines the call to perform.",
+      "oneOf": [
+        {
+          "title": "CallAsyncAPI",
+          "description": "Defines the AsyncAPI call to perform.",
+          "$ref": "#/$defs/taskBase",
+          "type": "object",
+          "required": [
+            "call",
+            "with"
+          ],
+          "unevaluatedProperties": false,
+          "properties": {
+            "call": {
+              "type": "string",
+              "const": "asyncapi"
+            },
+            "with": {
+              "type": "object",
+              "title": "AsyncApiArguments",
+              "description": "The Async API call arguments.",
+              "properties": {
+                "document": {
+                  "$ref": "#/$defs/externalResource",
+                  "title": "AsyncAPIDocument",
+                  "description": "The document that defines the AsyncAPI operation to call."
+                },
+                "channel": {
+                  "type": "string",
+                  "title": "With",
+                  "description": "The name of the channel on which to perform the operation. Used only in case the referenced document uses AsyncAPI v2.6.0."
+                },
+                "operation": {
+                  "type": "string",
+                  "title": "AsyncAPIOperation",
+                  "description": "A reference to the AsyncAPI operation to call."
+                },
+                "server": {
+                  "$ref": "#/$defs/asyncApiServer",
+                  "title": "AsyncAPIServer",
+                  "description": "An object used to configure to the server to call the specified AsyncAPI operation on."
+                },
+                "protocol": {
+                  "type": "string",
+                  "title": "AsyncApiProtocol",
+                  "description": "The protocol to use to select the target server.",
+                  "enum": [
+                    "amqp",
+                    "amqp1",
+                    "anypointmq",
+                    "googlepubsub",
+                    "http",
+                    "ibmmq",
+                    "jms",
+                    "kafka",
+                    "mercure",
+                    "mqtt",
+                    "mqtt5",
+                    "nats",
+                    "pulsar",
+                    "redis",
+                    "sns",
+                    "solace",
+                    "sqs",
+                    "stomp",
+                    "ws"
+                  ]
+                },
+                "message": {
+                  "$ref": "#/$defs/asyncApiOutboundMessage",
+                  "title": "AsyncApiMessage",
+                  "description": "An object used to configure the message to publish using the target operation."
+                },
+                "subscription": {
+                  "$ref": "#/$defs/asyncApiSubscription",
+                  "title": "AsyncApiSubscription",
+                  "description": "An object used to configure the subscription to messages consumed using the target operation."
+                },
+                "authentication": {
+                  "$ref": "#/$defs/referenceableAuthenticationPolicy",
+                  "title": "AsyncAPIAuthentication",
+                  "description": "The authentication policy, if any, to use when calling the AsyncAPI operation."
+                }
+              },
+              "oneOf": [
+                {
+                  "required": [
+                    "document",
+                    "operation",
+                    "message"
+                  ]
+                },
+                {
+                  "required": [
+                    "document",
+                    "operation",
+                    "subscription"
+                  ]
+                },
+                {
+                  "required": [
+                    "document",
+                    "channel",
+                    "message"
+                  ]
+                },
+                {
+                  "required": [
+                    "document",
+                    "channel",
+                    "subscription"
+                  ]
+                }
+              ],
+              "unevaluatedProperties": false
+            }
+          }
+        },
+        {
+          "title": "CallGRPC",
+          "description": "Defines the GRPC call to perform.",
+          "$ref": "#/$defs/taskBase",
+          "type": "object",
+          "unevaluatedProperties": false,
+          "required": [
+            "call",
+            "with"
+          ],
+          "properties": {
+            "call": {
+              "type": "string",
+              "const": "grpc"
+            },
+            "with": {
+              "type": "object",
+              "title": "GRPCArguments",
+              "description": "The GRPC call arguments.",
+              "properties": {
+                "proto": {
+                  "$ref": "#/$defs/externalResource",
+                  "title": "WithGRPCProto",
+                  "description": "The proto resource that describes the GRPC service to call."
+                },
+                "service": {
+                  "type": "object",
+                  "title": "WithGRPCService",
+                  "unevaluatedProperties": false,
+                  "properties": {
+                    "name": {
+                      "type": "string",
+                      "title": "WithGRPCServiceName",
+                      "description": "The name of the GRPC service to call."
+                    },
+                    "host": {
+                      "type": "string",
+                      "title": "WithGRPCServiceHost",
+                      "description": "The hostname of the GRPC service to call.",
+                      "pattern": "^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$"
+                    },
+                    "port": {
+                      "type": "integer",
+                      "title": "WithGRPCServicePost",
+                      "description": "The port number of the GRPC service to call.",
+                      "minimum": 0,
+                      "maximum": 65535
+                    },
+                    "authentication": {
+                      "$ref": "#/$defs/referenceableAuthenticationPolicy",
+                      "title": "WithGRPCServiceAuthentication",
+                      "description": "The endpoint's authentication policy, if any."
+                    }
+                  },
+                  "required": [
+                    "name",
+                    "host"
+                  ]
+                },
+                "method": {
+                  "type": "string",
+                  "title": "WithGRPCMethod",
+                  "description": "The name of the method to call on the defined GRPC service."
+                },
+                "arguments": {
+                  "type": "object",
+                  "title": "WithGRPCArguments",
+                  "description": "The arguments, if any, to call the method with.",
+                  "additionalProperties": true
+                }
+              },
+              "required": [
+                "proto",
+                "service",
+                "method"
+              ],
+              "unevaluatedProperties": false
+            }
+          }
+        },
+        {
+          "title": "CallHTTP",
+          "description": "Defines the HTTP call to perform.",
+          "$ref": "#/$defs/taskBase",
+          "type": "object",
+          "unevaluatedProperties": false,
+          "required": [
+            "call",
+            "with"
+          ],
+          "properties": {
+            "call": {
+              "type": "string",
+              "const": "http"
+            },
+            "with": {
+              "type": "object",
+              "title": "HTTPArguments",
+              "description": "The HTTP call arguments.",
+              "properties": {
+                "method": {
+                  "type": "string",
+                  "title": "HTTPMethod",
+                  "description": "The HTTP method of the HTTP request to perform."
+                },
+                "endpoint": {
+                  "title": "HTTPEndpoint",
+                  "description": "The HTTP endpoint to send the request to.",
+                  "$ref": "#/$defs/endpoint"
+                },
+                "headers": {
+                  "type": "object",
+                  "title": "HTTPHeaders",
+                  "description": "A name/value mapping of the headers, if any, of the HTTP request to perform."
+                },
+                "body": {
+                  "title": "HTTPBody",
+                  "description": "The body, if any, of the HTTP request to perform."
+                },
+                "query": {
+                  "type": "object",
+                  "title": "HTTPQuery",
+                  "description": "A name/value mapping of the query parameters, if any, of the HTTP request to perform.",
+                  "additionalProperties": true
+                },
+                "output": {
+                  "type": "string",
+                  "title": "HTTPOutput",
+                  "description": "The http call output format. Defaults to 'content'.",
+                  "enum": [
+                    "raw",
+                    "content",
+                    "response"
+                  ]
+                },
+                "redirect": {
+                  "type": "boolean",
+                  "title": "HttpRedirect",
+                  "description": "Specifies whether redirection status codes (`300–399`) should be treated as errors."
+                }
+              },
+              "required": [
+                "method",
+                "endpoint"
+              ],
+              "unevaluatedProperties": false
+            }
+          }
+        },
+        {
+          "title": "CallOpenAPI",
+          "description": "Defines the OpenAPI call to perform.",
+          "$ref": "#/$defs/taskBase",
+          "type": "object",
+          "unevaluatedProperties": false,
+          "required": [
+            "call",
+            "with"
+          ],
+          "properties": {
+            "call": {
+              "type": "string",
+              "const": "openapi"
+            },
+            "with": {
+              "type": "object",
+              "title": "OpenAPIArguments",
+              "description": "The OpenAPI call arguments.",
+              "properties": {
+                "document": {
+                  "$ref": "#/$defs/externalResource",
+                  "title": "WithOpenAPIDocument",
+                  "description": "The document that defines the OpenAPI operation to call."
+                },
+                "operationId": {
+                  "type": "string",
+                  "title": "WithOpenAPIOperation",
+                  "description": "The id of the OpenAPI operation to call."
+                },
+                "parameters": {
+                  "type": "object",
+                  "title": "WithOpenAPIParameters",
+                  "description": "A name/value mapping of the parameters of the OpenAPI operation to call.",
+                  "additionalProperties": true
+                },
+                "authentication": {
+                  "$ref": "#/$defs/referenceableAuthenticationPolicy",
+                  "title": "WithOpenAPIAuthentication",
+                  "description": "The authentication policy, if any, to use when calling the OpenAPI operation."
+                },
+                "output": {
+                  "type": "string",
+                  "enum": [
+                    "raw",
+                    "content",
+                    "response"
+                  ],
+                  "title": "WithOpenAPIOutput",
+                  "description": "The http call output format. Defaults to 'content'."
+                },
+                "redirect": {
+                  "type": "boolean",
+                  "title": "HttpRedirect",
+                  "description": "Specifies whether redirection status codes (`300–399`) should be treated as errors."
+                }
+              },
+              "required": [
+                "document",
+                "operationId"
+              ],
+              "unevaluatedProperties": false
+            }
+          }
+        },
+        {
+          "title": "CallFunction",
+          "description": "Defines the function call to perform.",
+          "$ref": "#/$defs/taskBase",
+          "type": "object",
+          "unevaluatedProperties": false,
+          "required": [
+            "call"
+          ],
+          "properties": {
+            "call": {
+              "type": "string",
+              "not": {
+                "enum": [
+                  "asyncapi",
+                  "grpc",
+                  "http",
+                  "openapi"
+                ]
+              },
+              "description": "The name of the function to call."
+            },
+            "with": {
+              "type": "object",
+              "title": "FunctionArguments",
+              "description": "A name/value mapping of the parameters, if any, to call the function with.",
+              "additionalProperties": true
+            }
+          }
+        }
+      ]
+    },
+    "forkTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "ForkTask",
+      "description": "Allows workflows to execute multiple tasks concurrently and optionally race them against each other, with a single possible winner, which sets the task's output.",
+      "unevaluatedProperties": false,
+      "required": [
+        "fork"
+      ],
+      "properties": {
+        "fork": {
+          "type": "object",
+          "title": "ForkTaskConfiguration",
+          "description": "The configuration of the branches to perform concurrently.",
+          "unevaluatedProperties": false,
+          "required": [
+            "branches"
+          ],
+          "properties": {
+            "branches": {
+              "$ref": "#/$defs/taskList",
+              "title": "ForkBranches"
+            },
+            "compete": {
+              "type": "boolean",
+              "title": "ForkCompete",
+              "description": "Indicates whether or not the concurrent tasks are racing against each other, with a single possible winner, which sets the composite task's output.",
+              "default": false
+            }
+          }
+        }
+      }
+    },
+    "doTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "DoTask",
+      "description": "Allows to execute a list of tasks in sequence.",
+      "unevaluatedProperties": false,
+      "required": [
+        "do"
+      ],
+      "properties": {
+        "do": {
+          "$ref": "#/$defs/taskList",
+          "title": "DoTaskConfiguration",
+          "description": "The configuration of the tasks to perform sequentially."
+        }
+      }
+    },
+    "emitTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "EmitTask",
+      "description": "Allows workflows to publish events to event brokers or messaging systems, facilitating communication and coordination between different components and services.",
+      "required": [
+        "emit"
+      ],
+      "unevaluatedProperties": false,
+      "properties": {
+        "emit": {
+          "type": "object",
+          "title": "EmitTaskConfiguration",
+          "description": "The configuration of an event's emission.",
+          "unevaluatedProperties": false,
+          "properties": {
+            "event": {
+              "type": "object",
+              "title": "EmitEventDefinition",
+              "description": "The definition of the event to emit.",
+              "properties": {
+                "with": {
+                  "$ref": "#/$defs/eventProperties",
+                  "title": "EmitEventWith",
+                  "description": "Defines the properties of event to emit.",
+                  "required": [
+                    "source",
+                    "type"
+                  ]
+                }
+              },
+              "additionalProperties": true
+            }
+          },
+          "required": [
+            "event"
+          ]
+        }
+      }
+    },
+    "forTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "ForTask",
+      "description": "Allows workflows to iterate over a collection of items, executing a defined set of subtasks for each item in the collection. This task type is instrumental in handling scenarios such as batch processing, data transformation, and repetitive operations across datasets.",
+      "required": [
+        "for",
+        "do"
+      ],
+      "unevaluatedProperties": false,
+      "properties": {
+        "for": {
+          "type": "object",
+          "title": "ForTaskConfiguration",
+          "description": "The definition of the loop that iterates over a range of values.",
+          "unevaluatedProperties": false,
+          "properties": {
+            "each": {
+              "type": "string",
+              "title": "ForEach",
+              "description": "The name of the variable used to store the current item being enumerated.",
+              "default": "item"
+            },
+            "in": {
+              "type": "string",
+              "title": "ForIn",
+              "description": "A runtime expression used to get the collection to enumerate."
+            },
+            "at": {
+              "type": "string",
+              "title": "ForAt",
+              "description": "The name of the variable used to store the index of the current item being enumerated.",
+              "default": "index"
+            }
+          },
+          "required": [
+            "in"
+          ]
+        },
+        "while": {
+          "type": "string",
+          "title": "While",
+          "description": "A runtime expression that represents the condition, if any, that must be met for the iteration to continue."
+        },
+        "do": {
+          "$ref": "#/$defs/taskList",
+          "title": "ForTaskDo"
+        }
+      }
+    },
+    "listenTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "ListenTask",
+      "description": "Provides a mechanism for workflows to await and react to external events, enabling event-driven behavior within workflow systems.",
+      "required": [
+        "listen"
+      ],
+      "unevaluatedProperties": false,
+      "properties": {
+        "listen": {
+          "type": "object",
+          "title": "ListenTaskConfiguration",
+          "description": "The configuration of the listener to use.",
+          "unevaluatedProperties": false,
+          "properties": {
+            "to": {
+              "$ref": "#/$defs/eventConsumptionStrategy",
+              "title": "ListenTo",
+              "description": "Defines the event(s) to listen to."
+            },
+            "read": {
+              "type": "string",
+              "enum": [
+                "data",
+                "envelope",
+                "raw"
+              ],
+              "default": "data",
+              "title": "ListenAndReadAs",
+              "description": "Specifies how events are read during the listen operation."
+            }
+          },
+          "required": [
+            "to"
+          ]
+        },
+        "foreach": {
+          "$ref": "#/$defs/subscriptionIterator",
+          "title": "ListenIterator",
+          "description": "Configures the iterator, if any, for processing consumed event(s)."
+        }
+      }
+    },
+    "raiseTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "RaiseTask",
+      "description": "Intentionally triggers and propagates errors.",
+      "required": [
+        "raise"
+      ],
+      "unevaluatedProperties": false,
+      "properties": {
+        "raise": {
+          "type": "object",
+          "title": "RaiseTaskConfiguration",
+          "description": "The definition of the error to raise.",
+          "unevaluatedProperties": false,
+          "properties": {
+            "error": {
+              "title": "RaiseTaskError",
+              "oneOf": [
+                {
+                  "$ref": "#/$defs/error",
+                  "title": "RaiseErrorDefinition",
+                  "description": "Defines the error to raise."
+                },
+                {
+                  "type": "string",
+                  "title": "RaiseErrorReference",
+                  "description": "The name of the error to raise"
+                }
+              ]
+            }
+          },
+          "required": [
+            "error"
+          ]
+        }
+      }
+    },
+    "runTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "RunTask",
+      "description": "Provides the capability to execute external containers, shell commands, scripts, or workflows.",
+      "required": [
+        "run"
+      ],
+      "unevaluatedProperties": false,
+      "properties": {
+        "run": {
+          "type": "object",
+          "title": "RunTaskConfiguration",
+          "description": "The configuration of the process to execute.",
+          "unevaluatedProperties": false,
+          "properties": {
+            "await": {
+              "type": "boolean",
+              "default": true,
+              "title": "AwaitProcessCompletion",
+              "description": "Whether to await the process completion before continuing."
+            },
+            "return": {
+              "type": "string",
+              "title": "ProcessReturnType",
+              "description": "Configures the output of the process.",
+              "enum": [
+                "stdout",
+                "stderr",
+                "code",
+                "all",
+                "none"
+              ],
+              "default": "stdout"
+            }
+          },
+          "oneOf": [
+            {
+              "title": "RunContainer",
+              "description": "Enables the execution of external processes encapsulated within a containerized environment.",
+              "properties": {
+                "container": {
+                  "type": "object",
+                  "title": "Container",
+                  "description": "The configuration of the container to run.",
+                  "unevaluatedProperties": false,
+                  "properties": {
+                    "image": {
+                      "type": "string",
+                      "title": "ContainerImage",
+                      "description": "The name of the container image to run."
+                    },
+                    "name": {
+                      "type": "string",
+                      "title": "ContainerName",
+                      "description": "A runtime expression, if any, used to give specific name to the container."
+                    },
+                    "command": {
+                      "type": "string",
+                      "title": "ContainerCommand",
+                      "description": "The command, if any, to execute on the container."
+                    },
+                    "ports": {
+                      "type": "object",
+                      "title": "ContainerPorts",
+                      "description": "The container's port mappings, if any."
+                    },
+                    "volumes": {
+                      "type": "object",
+                      "title": "ContainerVolumes",
+                      "description": "The container's volume mappings, if any."
+                    },
+                    "environment": {
+                      "type": "object",
+                      "title": "ContainerEnvironment",
+                      "description": "A key/value mapping of the environment variables, if any, to use when running the configured process."
+                    },
+                    "lifetime": {
+                      "$ref": "#/$defs/containerLifetime",
+                      "title": "ContainerLifetime",
+                      "description": "An object, if any, used to configure the container's lifetime"
+                    }
+                  },
+                  "required": [
+                    "image"
+                  ]
+                }
+              },
+              "required": [
+                "container"
+              ]
+            },
+            {
+              "title": "RunScript",
+              "description": "Enables the execution of custom scripts or code within a workflow, empowering workflows to perform specialized logic, data processing, or integration tasks by executing user-defined scripts written in various programming languages.",
+              "properties": {
+                "script": {
+                  "type": "object",
+                  "title": "Script",
+                  "description": "The configuration of the script to run.",
+                  "unevaluatedProperties": false,
+                  "properties": {
+                    "language": {
+                      "type": "string",
+                      "title": "ScriptLanguage",
+                      "description": "The language of the script to run."
+                    },
+                    "arguments": {
+                      "type": "object",
+                      "title": "ScriptArguments",
+                      "description": "A key/value mapping of the arguments, if any, to use when running the configured script.",
+                      "additionalProperties": true
+                    },
+                    "environment": {
+                      "type": "object",
+                      "title": "ScriptEnvironment",
+                      "description": "A key/value mapping of the environment variables, if any, to use when running the configured script process.",
+                      "additionalProperties": true
+                    }
+                  },
+                  "oneOf": [
+                    {
+                      "title": "InlineScript",
+                      "type": "object",
+                      "description": "The script's code.",
+                      "properties": {
+                        "code": {
+                          "type": "string",
+                          "title": "InlineScriptCode"
+                        }
+                      },
+                      "required": [
+                        "code"
+                      ]
+                    },
+                    {
+                      "title": "ExternalScript",
+                      "type": "object",
+                      "description": "The script's resource.",
+                      "properties": {
+                        "source": {
+                          "$ref": "#/$defs/externalResource",
+                          "title": "ExternalScriptResource"
+                        }
+                      },
+                      "required": [
+                        "source"
+                      ]
+                    }
+                  ],
+                  "required": [
+                    "language"
+                  ]
+                }
+              },
+              "required": [
+                "script"
+              ]
+            },
+            {
+              "title": "RunShell",
+              "description": "Enables the execution of shell commands within a workflow, enabling workflows to interact with the underlying operating system and perform system-level operations, such as file manipulation, environment configuration, or system administration tasks.",
+              "properties": {
+                "shell": {
+                  "type": "object",
+                  "title": "Shell",
+                  "description": "The configuration of the shell command to run.",
+                  "unevaluatedProperties": false,
+                  "properties": {
+                    "command": {
+                      "type": "string",
+                      "title": "ShellCommand",
+                      "description": "The shell command to run."
+                    },
+                    "arguments": {
+                      "type": "object",
+                      "title": "ShellArguments",
+                      "description": "A list of the arguments of the shell command to run.",
+                      "additionalProperties": true
+                    },
+                    "environment": {
+                      "type": "object",
+                      "title": "ShellEnvironment",
+                      "description": "A key/value mapping of the environment variables, if any, to use when running the configured process.",
+                      "additionalProperties": true
+                    }
+                  },
+                  "required": [
+                    "command"
+                  ]
+                }
+              },
+              "required": [
+                "shell"
+              ]
+            },
+            {
+              "title": "RunWorkflow",
+              "description": "Enables the invocation and execution of nested workflows within a parent workflow, facilitating modularization, reusability, and abstraction of complex logic or business processes by encapsulating them into standalone workflow units.",
+              "properties": {
+                "workflow": {
+                  "type": "object",
+                  "title": "SubflowConfiguration",
+                  "description": "The configuration of the workflow to run.",
+                  "unevaluatedProperties": false,
+                  "properties": {
+                    "namespace": {
+                      "type": "string",
+                      "title": "SubflowNamespace",
+                      "description": "The namespace the workflow to run belongs to."
+                    },
+                    "name": {
+                      "type": "string",
+                      "title": "SubflowName",
+                      "description": "The name of the workflow to run."
+                    },
+                    "version": {
+                      "type": "string",
+                      "default": "latest",
+                      "title": "SubflowVersion",
+                      "description": "The version of the workflow to run. Defaults to latest."
+                    },
+                    "input": {
+                      "type": "object",
+                      "title": "SubflowInput",
+                      "description": "The data, if any, to pass as input to the workflow to execute. The value should be validated against the target workflow's input schema, if specified.",
+                      "additionalProperties": true
+                    }
+                  },
+                  "required": [
+                    "namespace",
+                    "name",
+                    "version"
+                  ]
+                }
+              },
+              "required": [
+                "workflow"
+              ]
+            }
+          ]
+        }
+      }
+    },
+    "setTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "SetTask",
+      "description": "A task used to set data.",
+      "required": [
+        "set"
+      ],
+      "unevaluatedProperties": false,
+      "properties": {
+        "set": {
+          "type": "object",
+          "title": "SetTaskConfiguration",
+          "description": "The data to set.",
+          "minProperties": 1,
+          "additionalProperties": true
+        }
+      }
+    },
+    "switchTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "SwitchTask",
+      "description": "Enables conditional branching within workflows, allowing them to dynamically select different paths based on specified conditions or criteria.",
+      "required": [
+        "switch"
+      ],
+      "unevaluatedProperties": false,
+      "properties": {
+        "switch": {
+          "type": "array",
+          "title": "SwitchTaskConfiguration",
+          "description": "The definition of the switch to use.",
+          "minItems": 1,
+          "items": {
+            "type": "object",
+            "title": "SwitchItem",
+            "minProperties": 1,
+            "maxProperties": 1,
+            "additionalProperties": {
+              "type": "object",
+              "title": "SwitchCase",
+              "description": "The definition of a case within a switch task, defining a condition and corresponding tasks to execute if the condition is met.",
+              "unevaluatedProperties": false,
+              "required": [
+                "then"
+              ],
+              "properties": {
+                "when": {
+                  "type": "string",
+                  "title": "SwitchCaseCondition",
+                  "description": "A runtime expression used to determine whether or not the case matches."
+                },
+                "then": {
+                  "$ref": "#/$defs/flowDirective",
+                  "title": "SwitchCaseOutcome",
+                  "description": "The flow directive to execute when the case matches."
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "tryTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "TryTask",
+      "description": "Serves as a mechanism within workflows to handle errors gracefully, potentially retrying failed tasks before proceeding with alternate ones.",
+      "required": [
+        "try",
+        "catch"
+      ],
+      "unevaluatedProperties": false,
+      "properties": {
+        "try": {
+          "$ref": "#/$defs/taskList",
+          "title": "TryTaskConfiguration",
+          "description": "The task(s) to perform."
+        },
+        "catch": {
+          "type": "object",
+          "title": "TryTaskCatch",
+          "description": "The object used to define the errors to catch.",
+          "unevaluatedProperties": false,
+          "properties": {
+            "errors": {
+              "type": "object",
+              "title": "CatchErrors",
+              "properties": {
+                "with": {
+                  "$ref": "#/$defs/errorFilter"
+                }
+              },
+              "description": "static error filter"
+            },
+            "as": {
+              "type": "string",
+              "title": "CatchAs",
+              "description": "The name of the runtime expression variable to save the error as. Defaults to 'error'."
+            },
+            "when": {
+              "type": "string",
+              "title": "CatchWhen",
+              "description": "A runtime expression used to determine whether to catch the filtered error."
+            },
+            "exceptWhen": {
+              "type": "string",
+              "title": "CatchExceptWhen",
+              "description": "A runtime expression used to determine whether not to catch the filtered error."
+            },
+            "retry": {
+              "oneOf": [
+                {
+                  "$ref": "#/$defs/retryPolicy",
+                  "title": "RetryPolicyDefinition",
+                  "description": "The retry policy to use, if any, when catching errors."
+                },
+                {
+                  "type": "string",
+                  "title": "RetryPolicyReference",
+                  "description": "The name of the retry policy to use, if any, when catching errors."
+                }
+              ]
+            },
+            "do": {
+              "$ref": "#/$defs/taskList",
+              "title": "TryTaskCatchDo",
+              "description": "The definition of the task(s) to run when catching an error."
+            }
+          }
+        }
+      }
+    },
+    "waitTask": {
+      "type": "object",
+      "$ref": "#/$defs/taskBase",
+      "title": "WaitTask",
+      "description": "Allows workflows to pause or delay their execution for a specified period of time.",
+      "required": [
+        "wait"
+      ],
+      "unevaluatedProperties": false,
+      "properties": {
+        "wait": {
+          "$ref": "#/$defs/duration",
+          "title": "WaitTaskConfiguration",
+          "description": "The amount of time to wait."
+        }
+      }
+    },
+    "flowDirective": {
+      "title": "FlowDirective",
+      "description": "Represents different transition options for a workflow.",
+      "anyOf": [
+        {
+          "title": "FlowDirectiveEnum",
+          "type": "string",
+          "enum": [
+            "continue",
+            "exit",
+            "end"
+          ],
+          "default": "continue"
+        },
+        {
+          "type": "string"
+        }
+      ]
+    },
+    "referenceableAuthenticationPolicy": {
+      "type": "object",
+      "title": "ReferenceableAuthenticationPolicy",
+      "description": "Represents a referenceable authentication policy.",
+      "unevaluatedProperties": false,
+      "oneOf": [
+        {
+          "title": "AuthenticationPolicyReference",
+          "description": "The reference of the authentication policy to use.",
+          "properties": {
+            "use": {
+              "type": "string",
+              "minLength": 1,
+              "title": "ReferenceableAuthenticationPolicyName",
+              "description": "The name of the authentication policy to use."
+            }
+          },
+          "required": [
+            "use"
+          ]
+        },
+        {
+          "$ref": "#/$defs/authenticationPolicy"
+        }
+      ]
+    },
+    "secretBasedAuthenticationPolicy": {
+      "type": "object",
+      "title": "SecretBasedAuthenticationPolicy",
+      "description": "Represents an authentication policy based on secrets.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "use": {
+          "type": "string",
+          "minLength": 1,
+          "title": "SecretBasedAuthenticationPolicyName",
+          "description": "The name of the authentication policy to use."
+        }
+      },
+      "required": [
+        "use"
+      ]
+    },
+    "authenticationPolicy": {
+      "type": "object",
+      "title": "AuthenticationPolicy",
+      "description": "Defines an authentication policy.",
+      "oneOf": [
+        {
+          "title": "BasicAuthenticationPolicy",
+          "description": "Use basic authentication.",
+          "properties": {
+            "basic": {
+              "type": "object",
+              "title": "BasicAuthenticationPolicyConfiguration",
+              "description": "The configuration of the basic authentication policy.",
+              "unevaluatedProperties": false,
+              "oneOf": [
+                {
+                  "title": "BasicAuthenticationProperties",
+                  "description": "Inline configuration of the basic authentication policy.",
+                  "properties": {
+                    "username": {
+                      "type": "string",
+                      "description": "The username to use."
+                    },
+                    "password": {
+                      "type": "string",
+                      "description": "The password to use."
+                    }
+                  },
+                  "required": [
+                    "username",
+                    "password"
+                  ]
+                },
+                {
+                  "$ref": "#/$defs/secretBasedAuthenticationPolicy",
+                  "title": "BasicAuthenticationPolicySecret",
+                  "description": "Secret based configuration of the basic authentication policy."
+                }
+              ]
+            }
+          },
+          "required": [
+            "basic"
+          ]
+        },
+        {
+          "title": "BearerAuthenticationPolicy",
+          "description": "Use bearer authentication.",
+          "properties": {
+            "bearer": {
+              "type": "object",
+              "title": "BearerAuthenticationPolicyConfiguration",
+              "description": "The configuration of the bearer authentication policy.",
+              "unevaluatedProperties": false,
+              "oneOf": [
+                {
+                  "title": "BearerAuthenticationProperties",
+                  "description": "Inline configuration of the bearer authentication policy.",
+                  "properties": {
+                    "token": {
+                      "type": "string",
+                      "description": "The bearer token to use."
+                    }
+                  },
+                  "required": [
+                    "token"
+                  ]
+                },
+                {
+                  "$ref": "#/$defs/secretBasedAuthenticationPolicy",
+                  "title": "BearerAuthenticationPolicySecret",
+                  "description": "Secret based configuration of the bearer authentication policy."
+                }
+              ]
+            }
+          },
+          "required": [
+            "bearer"
+          ]
+        },
+        {
+          "title": "DigestAuthenticationPolicy",
+          "description": "Use digest authentication.",
+          "properties": {
+            "digest": {
+              "type": "object",
+              "title": "DigestAuthenticationPolicyConfiguration",
+              "description": "The configuration of the digest authentication policy.",
+              "unevaluatedProperties": false,
+              "oneOf": [
+                {
+                  "title": "DigestAuthenticationProperties",
+                  "description": "Inline configuration of the digest authentication policy.",
+                  "properties": {
+                    "username": {
+                      "type": "string",
+                      "description": "The username to use."
+                    },
+                    "password": {
+                      "type": "string",
+                      "description": "The password to use."
+                    }
+                  },
+                  "required": [
+                    "username",
+                    "password"
+                  ]
+                },
+                {
+                  "$ref": "#/$defs/secretBasedAuthenticationPolicy",
+                  "title": "DigestAuthenticationPolicySecret",
+                  "description": "Secret based configuration of the digest authentication policy."
+                }
+              ]
+            }
+          },
+          "required": [
+            "digest"
+          ]
+        },
+        {
+          "title": "OAuth2AuthenticationPolicy",
+          "description": "Use OAuth2 authentication.",
+          "properties": {
+            "oauth2": {
+              "type": "object",
+              "title": "OAuth2AuthenticationPolicyConfiguration",
+              "description": "The configuration of the OAuth2 authentication policy.",
+              "unevaluatedProperties": false,
+              "oneOf": [
+                {
+                  "type": "object",
+                  "title": "OAuth2ConnectAuthenticationProperties",
+                  "description": "The inline configuration of the OAuth2 authentication policy.",
+                  "unevaluatedProperties": false,
+                  "allOf": [
+                    {
+                      "$ref": "#/$defs/oauth2AuthenticationProperties"
+                    },
+                    {
+                      "type": "object",
+                      "properties": {
+                        "endpoints": {
+                          "type": "object",
+                          "title": "OAuth2AuthenticationPropertiesEndpoints",
+                          "description": "The endpoint configurations for OAuth2.",
+                          "properties": {
+                            "token": {
+                              "type": "string",
+                              "format": "uri-template",
+                              "default": "/oauth2/token",
+                              "title": "OAuth2TokenEndpoint",
+                              "description": "The relative path to the token endpoint. Defaults to `/oauth2/token`."
+                            },
+                            "revocation": {
+                              "type": "string",
+                              "format": "uri-template",
+                              "default": "/oauth2/revoke",
+                              "title": "OAuth2RevocationEndpoint",
+                              "description": "The relative path to the revocation endpoint. Defaults to `/oauth2/revoke`."
+                            },
+                            "introspection": {
+                              "type": "string",
+                              "format": "uri-template",
+                              "default": "/oauth2/introspect",
+                              "title": "OAuth2IntrospectionEndpoint",
+                              "description": "The relative path to the introspection endpoint. Defaults to `/oauth2/introspect`."
+                            }
+                          }
+                        }
+                      }
+                    }
+                  ]
+                },
+                {
+                  "$ref": "#/$defs/secretBasedAuthenticationPolicy",
+                  "title": "OAuth2AuthenticationPolicySecret",
+                  "description": "Secret based configuration of the OAuth2 authentication policy."
+                }
+              ]
+            }
+          },
+          "required": [
+            "oauth2"
+          ]
+        },
+        {
+          "title": "OpenIdConnectAuthenticationPolicy",
+          "description": "Use OpenIdConnect authentication.",
+          "properties": {
+            "oidc": {
+              "type": "object",
+              "title": "OpenIdConnectAuthenticationPolicyConfiguration",
+              "description": "The configuration of the OpenIdConnect authentication policy.",
+              "unevaluatedProperties": false,
+              "oneOf": [
+                {
+                  "$ref": "#/$defs/oauth2AuthenticationProperties",
+                  "title": "OpenIdConnectAuthenticationProperties",
+                  "description": "The inline configuration of the OpenIdConnect authentication policy.",
+                  "unevaluatedProperties": false
+                },
+                {
+                  "$ref": "#/$defs/secretBasedAuthenticationPolicy",
+                  "title": "OpenIdConnectAuthenticationPolicySecret",
+                  "description": "Secret based configuration of the OpenIdConnect authentication policy."
+                }
+              ]
+            }
+          },
+          "required": [
+            "oidc"
+          ]
+        }
+      ]
+    },
+    "oauth2AuthenticationProperties": {
+      "type": "object",
+      "title": "OAuth2AutenthicationData",
+      "description": "Inline configuration of the OAuth2 authentication policy.",
+      "properties": {
+        "authority": {
+          "$ref": "#/$defs/uriTemplate",
+          "title": "OAuth2AutenthicationDataAuthority",
+          "description": "The URI that references the OAuth2 authority to use."
+        },
+        "grant": {
+          "type": "string",
+          "enum": [
+            "authorization_code",
+            "client_credentials",
+            "password",
+            "refresh_token",
+            "urn:ietf:params:oauth:grant-type:token-exchange"
+          ],
+          "title": "OAuth2AutenthicationDataGrant",
+          "description": "The grant type to use."
+        },
+        "client": {
+          "type": "object",
+          "title": "OAuth2AutenthicationDataClient",
+          "description": "The definition of an OAuth2 client.",
+          "unevaluatedProperties": false,
+          "properties": {
+            "id": {
+              "type": "string",
+              "title": "ClientId",
+              "description": "The client id to use."
+            },
+            "secret": {
+              "type": "string",
+              "title": "ClientSecret",
+              "description": "The client secret to use, if any."
+            },
+            "assertion": {
+              "type": "string",
+              "title": "ClientAssertion",
+              "description": "A JWT containing a signed assertion with your application credentials."
+            },
+            "authentication": {
+              "type": "string",
+              "enum": [
+                "client_secret_basic",
+                "client_secret_post",
+                "client_secret_jwt",
+                "private_key_jwt",
+                "none"
+              ],
+              "default": "client_secret_post",
+              "title": "ClientAuthentication",
+              "description": "The authentication method to use to authenticate the client."
+            }
+          }
+        },
+        "request": {
+          "type": "object",
+          "title": "OAuth2TokenRequest",
+          "description": "The configuration of an OAuth2 token request",
+          "properties": {
+            "encoding": {
+              "type": "string",
+              "enum": [
+                "application/x-www-form-urlencoded",
+                "application/json"
+              ],
+              "default": "application/x-www-form-urlencoded",
+              "title": "Oauth2TokenRequestEncoding"
+            }
+          }
+        },
+        "issuers": {
+          "type": "array",
+          "title": "OAuth2Issuers",
+          "description": "A list that contains that contains valid issuers that will be used to check against the issuer of generated tokens.",
+          "items": {
+            "type": "string"
+          }
+        },
+        "scopes": {
+          "type": "array",
+          "title": "OAuth2AutenthicationDataScopes",
+          "description": "The scopes, if any, to request the token for.",
+          "items": {
+            "type": "string"
+          }
+        },
+        "audiences": {
+          "type": "array",
+          "title": "OAuth2AutenthicationDataAudiences",
+          "description": "The audiences, if any, to request the token for.",
+          "items": {
+            "type": "string"
+          }
+        },
+        "username": {
+          "type": "string",
+          "title": "OAuth2AutenthicationDataUsername",
+          "description": "The username to use. Used only if the grant type is Password."
+        },
+        "password": {
+          "type": "string",
+          "title": "OAuth2AutenthicationDataPassword",
+          "description": "The password to use. Used only if the grant type is Password."
+        },
+        "subject": {
+          "$ref": "#/$defs/oauth2Token",
+          "title": "OAuth2AutenthicationDataSubject",
+          "description": "The security token that represents the identity of the party on behalf of whom the request is being made."
+        },
+        "actor": {
+          "$ref": "#/$defs/oauth2Token",
+          "title": "OAuth2AutenthicationDataActor",
+          "description": "The security token that represents the identity of the acting party."
+        }
+      }
+    },
+    "oauth2Token": {
+      "type": "object",
+      "title": "OAuth2TokenDefinition",
+      "description": "Represents an OAuth2 token.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "token": {
+          "type": "string",
+          "title": "OAuth2Token",
+          "description": "The security token to use."
+        },
+        "type": {
+          "type": "string",
+          "title": "OAuth2TokenType",
+          "description": "The type of the security token to use."
+        }
+      },
+      "required": [
+        "token",
+        "type"
+      ]
+    },
+    "duration": {
+      "oneOf": [
+        {
+          "type": "object",
+          "minProperties": 1,
+          "unevaluatedProperties": false,
+          "properties": {
+            "days": {
+              "type": "integer",
+              "title": "DurationDays",
+              "description": "Number of days, if any."
+            },
+            "hours": {
+              "type": "integer",
+              "title": "DurationHours",
+              "description": "Number of days, if any."
+            },
+            "minutes": {
+              "type": "integer",
+              "title": "DurationMinutes",
+              "description": "Number of minutes, if any."
+            },
+            "seconds": {
+              "type": "integer",
+              "title": "DurationSeconds",
+              "description": "Number of seconds, if any."
+            },
+            "milliseconds": {
+              "type": "integer",
+              "title": "DurationMilliseconds",
+              "description": "Number of milliseconds, if any."
+            }
+          },
+          "title": "DurationInline",
+          "description": "The inline definition of a duration."
+        },
+        {
+          "type": "string",
+          "pattern": "^P(?!$)(\\d+(?:\\.\\d+)?Y)?(\\d+(?:\\.\\d+)?M)?(\\d+(?:\\.\\d+)?W)?(\\d+(?:\\.\\d+)?D)?(T(?=\\d)(\\d+(?:\\.\\d+)?H)?(\\d+(?:\\.\\d+)?M)?(\\d+(?:\\.\\d+)?S)?)?$",
+          "title": "DurationExpression",
+          "description": "The ISO 8601 expression of a duration."
+        }
+      ]
+    },
+    "error": {
+      "type": "object",
+      "title": "Error",
+      "description": "Represents an error.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "type": {
+          "title": "ErrorType",
+          "description": "A URI reference that identifies the error type.",
+          "oneOf": [
+            {
+              "title": "LiteralErrorType",
+              "$ref": "#/$defs/uriTemplate",
+              "description": "The literal error type."
+            },
+            {
+              "title": "ExpressionErrorType",
+              "$ref": "#/$defs/runtimeExpression",
+              "description": "An expression based error type."
+            }
+          ]
+        },
+        "status": {
+          "type": "integer",
+          "title": "ErrorStatus",
+          "description": "The status code generated by the origin for this occurrence of the error."
+        },
+        "instance": {
+          "title": "ErrorInstance",
+          "description": "A JSON Pointer used to reference the component the error originates from.",
+          "oneOf": [
+            {
+              "title": "LiteralErrorInstance",
+              "description": "The literal error instance.",
+              "type": "string",
+              "format": "json-pointer"
+            },
+            {
+              "$ref": "#/$defs/runtimeExpression",
+              "title": "ExpressionErrorInstance",
+              "description": "An expression based error instance."
+            }
+          ]
+        },
+        "title": {
+          "type": "string",
+          "title": "ErrorTitle",
+          "description": "A short, human-readable summary of the error."
+        },
+        "detail": {
+          "type": "string",
+          "title": "ErrorDetails",
+          "description": "A human-readable explanation specific to this occurrence of the error."
+        }
+      },
+      "required": [
+        "type",
+        "status"
+      ]
+    },
+    "errorFilter": {
+      "type": "object",
+      "title": "ErrorFilter",
+      "description": "Error filtering base on static values. For error filtering on dynamic values, use catch.when property",
+      "minProperties": 1,
+      "properties": {
+        "type": {
+          "type": "string",
+          "description": "if present, means this value should be used for filtering"
+        },
+        "status": {
+          "type": "integer",
+          "description": "if present, means this value should be used for filtering"
+        },
+        "instance": {
+          "type": "string",
+          "description": "if present, means this value should be used for filtering"
+        },
+        "title": {
+          "type": "string",
+          "description": "if present, means this value should be used for filtering"
+        },
+        "details": {
+          "type": "string",
+          "description": "if present, means this value should be used for filtering"
+        }
+      }
+    },
+    "uriTemplate": {
+      "title": "UriTemplate",
+      "anyOf": [
+        {
+          "title": "LiteralUriTemplate",
+          "type": "string",
+          "format": "uri-template",
+          "pattern": "^[A-Za-z][A-Za-z0-9+\\-.]*://.*"
+        },
+        {
+          "title": "LiteralUri",
+          "type": "string",
+          "format": "uri",
+          "pattern": "^[A-Za-z][A-Za-z0-9+\\-.]*://.*"
+        }
+      ]
+    },
+    "endpoint": {
+      "title": "Endpoint",
+      "description": "Represents an endpoint.",
+      "oneOf": [
+        {
+          "$ref": "#/$defs/runtimeExpression"
+        },
+        {
+          "$ref": "#/$defs/uriTemplate"
+        },
+        {
+          "title": "EndpointConfiguration",
+          "type": "object",
+          "unevaluatedProperties": false,
+          "properties": {
+            "uri": {
+              "title": "EndpointUri",
+              "description": "The endpoint's URI.",
+              "oneOf": [
+                {
+                  "title": "LiteralEndpointURI",
+                  "description": "The literal endpoint's URI.",
+                  "$ref": "#/$defs/uriTemplate"
+                },
+                {
+                  "title": "ExpressionEndpointURI",
+                  "$ref": "#/$defs/runtimeExpression",
+                  "description": "An expression based endpoint's URI."
+                }
+              ]
+            },
+            "authentication": {
+              "$ref": "#/$defs/referenceableAuthenticationPolicy",
+              "title": "EndpointAuthentication",
+              "description": "The authentication policy to use."
+            }
+          },
+          "required": [
+            "uri"
+          ]
+        }
+      ]
+    },
+    "eventProperties": {
+      "type": "object",
+      "title": "EventProperties",
+      "description": "Describes the properties of an event.",
+      "properties": {
+        "id": {
+          "type": "string",
+          "title": "EventId",
+          "description": "The event's unique identifier."
+        },
+        "source": {
+          "title": "EventSource",
+          "description": "Identifies the context in which an event happened.",
+          "oneOf": [
+            {
+              "$ref": "#/$defs/uriTemplate"
+            },
+            {
+              "$ref": "#/$defs/runtimeExpression"
+            }
+          ]
+        },
+        "type": {
+          "type": "string",
+          "title": "EventType",
+          "description": "This attribute contains a value describing the type of event related to the originating occurrence."
+        },
+        "time": {
+          "title": "EventTime",
+          "description": "When the event occured.",
+          "oneOf": [
+            {
+              "title": "LiteralTime",
+              "type": "string",
+              "format": "date-time"
+            },
+            {
+              "$ref": "#/$defs/runtimeExpression"
+            }
+          ]
+        },
+        "subject": {
+          "type": "string",
+          "title": "EventSubject",
+          "description": "The subject of the event."
+        },
+        "datacontenttype": {
+          "type": "string",
+          "title": "EventDataContentType",
+          "description": "Content type of data value. This attribute enables data to carry any type of content, whereby format and encoding might differ from that of the chosen event format."
+        },
+        "dataschema": {
+          "title": "EventDataschema",
+          "description": "The schema describing the event format.",
+          "oneOf": [
+            {
+              "title": "LiteralDataSchema",
+              "$ref": "#/$defs/uriTemplate",
+              "description": "The literal event data schema."
+            },
+            {
+              "title": "ExpressionDataSchema",
+              "$ref": "#/$defs/runtimeExpression",
+              "description": "An expression based event data schema."
+            }
+          ]
+        },
+        "data": {
+          "title": "EventData",
+          "description": "The event's payload data",
+          "anyOf": [
+            {
+              "$ref": "#/$defs/runtimeExpression"
+            },
+            {}
+          ]
+        }
+      },
+      "additionalProperties": true
+    },
+    "eventConsumptionStrategy": {
+      "type": "object",
+      "title": "EventConsumptionStrategy",
+      "description": "Describe the event consumption strategy to adopt.",
+      "unevaluatedProperties": false,
+      "oneOf": [
+        {
+          "title": "AllEventConsumptionStrategy",
+          "properties": {
+            "all": {
+              "type": "array",
+              "title": "AllEventConsumptionStrategyConfiguration",
+              "description": "A list containing all the events that must be consumed.",
+              "items": {
+                "$ref": "#/$defs/eventFilter"
+              }
+            }
+          },
+          "required": [
+            "all"
+          ]
+        },
+        {
+          "title": "AnyEventConsumptionStrategy",
+          "properties": {
+            "any": {
+              "type": "array",
+              "title": "AnyEventConsumptionStrategyConfiguration",
+              "description": "A list containing any of the events to consume.",
+              "items": {
+                "$ref": "#/$defs/eventFilter"
+              }
+            },
+            "until": {
+              "oneOf": [
+                {
+                  "type": "string",
+                  "title": "AnyEventUntilCondition",
+                  "description": "A runtime expression condition evaluated after consuming an event and which determines whether or not to continue listening."
+                },
+                {
+                  "allOf": [
+                    {
+                      "$ref": "#/$defs/eventConsumptionStrategy",
+                      "description": "The strategy that defines the event(s) to consume to stop listening."
+                    },
+                    {
+                      "properties": {
+                        "until": false
+                      }
+                    }
+                  ],
+                  "title": "AnyEventUntilConsumed"
+                }
+              ]
+            }
+          },
+          "required": [
+            "any"
+          ]
+        },
+        {
+          "title": "OneEventConsumptionStrategy",
+          "properties": {
+            "one": {
+              "$ref": "#/$defs/eventFilter",
+              "title": "OneEventConsumptionStrategyConfiguration",
+              "description": "The single event to consume."
+            }
+          },
+          "required": [
+            "one"
+          ]
+        }
+      ]
+    },
+    "eventFilter": {
+      "type": "object",
+      "title": "EventFilter",
+      "description": "An event filter is a mechanism used to selectively process or handle events based on predefined criteria, such as event type, source, or specific attributes.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "with": {
+          "$ref": "#/$defs/eventProperties",
+          "minProperties": 1,
+          "title": "WithEvent",
+          "description": "An event filter is a mechanism used to selectively process or handle events based on predefined criteria, such as event type, source, or specific attributes."
+        },
+        "correlate": {
+          "type": "object",
+          "title": "EventFilterCorrelate",
+          "description": "A correlation is a link between events and data, established by mapping event attributes to specific data attributes, allowing for coordinated processing or handling based on event characteristics.",
+          "additionalProperties": {
+            "type": "object",
+            "properties": {
+              "from": {
+                "type": "string",
+                "title": "CorrelateFrom",
+                "description": "A runtime expression used to extract the correlation value from the filtered event."
+              },
+              "expect": {
+                "type": "string",
+                "title": "CorrelateExpect",
+                "description": "A constant or a runtime expression, if any, used to determine whether or not the extracted correlation value matches expectations. If not set, the first extracted value will be used as the correlation's expectation."
+              }
+            },
+            "required": [
+              "from"
+            ]
+          }
+        }
+      },
+      "required": [
+        "with"
+      ]
+    },
+    "extension": {
+      "type": "object",
+      "title": "Extension",
+      "description": "The definition of an extension.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "extend": {
+          "type": "string",
+          "enum": [
+            "call",
+            "composite",
+            "emit",
+            "for",
+            "listen",
+            "raise",
+            "run",
+            "set",
+            "switch",
+            "try",
+            "wait",
+            "all"
+          ],
+          "title": "ExtensionTarget",
+          "description": "The type of task to extend."
+        },
+        "when": {
+          "type": "string",
+          "title": "ExtensionCondition",
+          "description": "A runtime expression, if any, used to determine whether or not the extension should apply in the specified context."
+        },
+        "before": {
+          "$ref": "#/$defs/taskList",
+          "title": "ExtensionDoBefore",
+          "description": "The task(s) to execute before the extended task, if any."
+        },
+        "after": {
+          "$ref": "#/$defs/taskList",
+          "title": "ExtensionDoAfter",
+          "description": "The task(s) to execute after the extended task, if any."
+        }
+      },
+      "required": [
+        "extend"
+      ]
+    },
+    "externalResource": {
+      "type": "object",
+      "title": "ExternalResource",
+      "description": "Represents an external resource.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "name": {
+          "type": "string",
+          "title": "ExternalResourceName",
+          "description": "The name of the external resource, if any."
+        },
+        "endpoint": {
+          "$ref": "#/$defs/endpoint",
+          "title": "ExternalResourceEndpoint",
+          "description": "The endpoint of the external resource."
+        }
+      },
+      "required": [
+        "endpoint"
+      ]
+    },
+    "input": {
+      "type": "object",
+      "title": "Input",
+      "description": "Configures the input of a workflow or task.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "schema": {
+          "$ref": "#/$defs/schema",
+          "title": "InputSchema",
+          "description": "The schema used to describe and validate the input of the workflow or task."
+        },
+        "from": {
+          "title": "InputFrom",
+          "description": "A runtime expression, if any, used to mutate and/or filter the input of the workflow or task.",
+          "oneOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "object"
+            }
+          ]
+        }
+      }
+    },
+    "output": {
+      "type": "object",
+      "title": "Output",
+      "description": "Configures the output of a workflow or task.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "schema": {
+          "$ref": "#/$defs/schema",
+          "title": "OutputSchema",
+          "description": "The schema used to describe and validate the output of the workflow or task."
+        },
+        "as": {
+          "title": "OutputAs",
+          "description": "A runtime expression, if any, used to mutate and/or filter the output of the workflow or task.",
+          "oneOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "object"
+            }
+          ]
+        }
+      }
+    },
+    "export": {
+      "type": "object",
+      "title": "Export",
+      "description": "Set the content of the context. .",
+      "unevaluatedProperties": false,
+      "properties": {
+        "schema": {
+          "$ref": "#/$defs/schema",
+          "title": "ExportSchema",
+          "description": "The schema used to describe and validate the workflow context."
+        },
+        "as": {
+          "title": "ExportAs",
+          "description": "A runtime expression, if any, used to export the output data to the context.",
+          "oneOf": [
+            {
+              "type": "string"
+            },
+            {
+              "type": "object"
+            }
+          ]
+        }
+      }
+    },
+    "retryPolicy": {
+      "type": "object",
+      "title": "RetryPolicy",
+      "description": "Defines a retry policy.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "when": {
+          "type": "string",
+          "title": "RetryWhen",
+          "description": "A runtime expression, if any, used to determine whether or not to retry running the task, in a given context."
+        },
+        "exceptWhen": {
+          "type": "string",
+          "title": "RetryExcepWhen",
+          "description": "A runtime expression used to determine whether or not to retry running the task, in a given context."
+        },
+        "delay": {
+          "$ref": "#/$defs/duration",
+          "title": "RetryDelay",
+          "description": "The duration to wait between retry attempts."
+        },
+        "backoff": {
+          "type": "object",
+          "title": "RetryBackoff",
+          "description": "The retry duration backoff.",
+          "unevaluatedProperties": false,
+          "oneOf": [
+            {
+              "title": "ConstantBackoff",
+              "properties": {
+                "constant": {
+                  "type": "object",
+                  "description": "The definition of the constant backoff to use, if any."
+                }
+              },
+              "required": [
+                "constant"
+              ]
+            },
+            {
+              "title": "ExponentialBackOff",
+              "properties": {
+                "exponential": {
+                  "type": "object",
+                  "description": "The definition of the exponential backoff to use, if any."
+                }
+              },
+              "required": [
+                "exponential"
+              ]
+            },
+            {
+              "title": "LinearBackoff",
+              "properties": {
+                "linear": {
+                  "type": "object",
+                  "description": "The definition of the linear backoff to use, if any."
+                }
+              },
+              "required": [
+                "linear"
+              ]
+            }
+          ]
+        },
+        "limit": {
+          "type": "object",
+          "title": "RetryLimit",
+          "unevaluatedProperties": false,
+          "properties": {
+            "attempt": {
+              "type": "object",
+              "title": "RetryLimitAttempt",
+              "unevaluatedProperties": false,
+              "properties": {
+                "count": {
+                  "type": "integer",
+                  "title": "RetryLimitAttemptCount",
+                  "description": "The maximum amount of retry attempts, if any."
+                },
+                "duration": {
+                  "$ref": "#/$defs/duration",
+                  "title": "RetryLimitAttemptDuration",
+                  "description": "The maximum duration for each retry attempt."
+                }
+              }
+            },
+            "duration": {
+              "$ref": "#/$defs/duration",
+              "title": "RetryLimitDuration",
+              "description": "The duration limit, if any, for all retry attempts."
+            }
+          },
+          "description": "The retry limit, if any."
+        },
+        "jitter": {
+          "type": "object",
+          "title": "RetryPolicyJitter",
+          "description": "The parameters, if any, that control the randomness or variability of the delay between retry attempts.",
+          "unevaluatedProperties": false,
+          "properties": {
+            "from": {
+              "$ref": "#/$defs/duration",
+              "title": "RetryPolicyJitterFrom",
+              "description": "The minimum duration of the jitter range."
+            },
+            "to": {
+              "$ref": "#/$defs/duration",
+              "title": "RetryPolicyJitterTo",
+              "description": "The maximum duration of the jitter range."
+            }
+          },
+          "required": [
+            "from",
+            "to"
+          ]
+        }
+      }
+    },
+    "schema": {
+      "type": "object",
+      "title": "Schema",
+      "description": "Represents the definition of a schema.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "format": {
+          "type": "string",
+          "default": "json",
+          "title": "SchemaFormat",
+          "description": "The schema's format. Defaults to 'json'. The (optional) version of the format can be set using `{format}:{version}`."
+        }
+      },
+      "oneOf": [
+        {
+          "title": "SchemaInline",
+          "properties": {
+            "document": {
+              "description": "The schema's inline definition."
+            }
+          },
+          "required": [
+            "document"
+          ]
+        },
+        {
+          "title": "SchemaExternal",
+          "properties": {
+            "resource": {
+              "$ref": "#/$defs/externalResource",
+              "title": "SchemaExternalResource",
+              "description": "The schema's external resource."
+            }
+          },
+          "required": [
+            "resource"
+          ]
+        }
+      ]
+    },
+    "timeout": {
+      "type": "object",
+      "title": "Timeout",
+      "description": "The definition of a timeout.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "after": {
+          "$ref": "#/$defs/duration",
+          "title": "TimeoutAfter",
+          "description": "The duration after which to timeout."
+        }
+      },
+      "required": [
+        "after"
+      ]
+    },
+    "catalog": {
+      "type": "object",
+      "title": "Catalog",
+      "description": "The definition of a resource catalog.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "endpoint": {
+          "$ref": "#/$defs/endpoint",
+          "title": "CatalogEndpoint",
+          "description": "The root URL where the catalog is hosted."
+        }
+      },
+      "required": [
+        "endpoint"
+      ]
+    },
+    "runtimeExpression": {
+      "type": "string",
+      "title": "RuntimeExpression",
+      "description": "A runtime expression.",
+      "pattern": "^\\s*\\$\\{.+\\}\\s*$"
+    },
+    "containerLifetime": {
+      "type": "object",
+      "title": "ContainerLifetime",
+      "description": "The configuration of a container's lifetime",
+      "unevaluatedProperties": false,
+      "properties": {
+        "cleanup": {
+          "type": "string",
+          "title": "ContainerCleanupPolicy",
+          "description": "The container cleanup policy to use",
+          "enum": [
+            "always",
+            "never",
+            "eventually"
+          ],
+          "default": "never"
+        },
+        "after": {
+          "$ref": "#/$defs/duration",
+          "title": "ContainerLifetimeDuration",
+          "description": "The duration after which to cleanup the container, in case the cleanup policy has been set to 'eventually'"
+        }
+      },
+      "required": [
+        "cleanup"
+      ],
+      "if": {
+        "properties": {
+          "cleanup": {
+            "const": "eventually"
+          }
+        }
+      },
+      "then": {
+        "required": [
+          "after"
+        ]
+      },
+      "else": {
+        "not": {
+          "required": [
+            "after"
+          ]
+        }
+      }
+    },
+    "processResult": {
+      "type": "object",
+      "title": "ProcessResult",
+      "description": "The object returned by a run task when its return type has been set 'all'.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "code": {
+          "type": "integer",
+          "title": "ProcessExitCode",
+          "description": "The process's exit code."
+        },
+        "stdout": {
+          "type": "string",
+          "title": "ProcessStandardOutput",
+          "description": "The content of the process's STDOUT."
+        },
+        "stderr": {
+          "type": "string",
+          "title": "ProcessStandardError",
+          "description": "The content of the process's STDERR."
+        }
+      },
+      "required": [
+        "code",
+        "stdout",
+        "stderr"
+      ]
+    },
+    "asyncApiServer": {
+      "type": "object",
+      "title": "AsyncApiServer",
+      "description": "Configures the target server of an AsyncAPI operation.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "name": {
+          "type": "string",
+          "title": "AsyncApiServerName",
+          "description": "The target server's name."
+        },
+        "variables": {
+          "type": "object",
+          "title": "AsyncApiServerVariables",
+          "description": "The target server's variables, if any."
+        }
+      },
+      "required": [
+        "name"
+      ]
+    },
+    "asyncApiOutboundMessage": {
+      "type": "object",
+      "title": "AsyncApiOutboundMessage",
+      "description": "An object used to configure the message to publish using the target operation.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "payload": {
+          "type": "object",
+          "title": "AsyncApiMessagePayload",
+          "description": "The message's payload, if any.",
+          "additionalProperties": true
+        },
+        "headers": {
+          "type": "object",
+          "title": "AsyncApiMessageHeaders",
+          "description": "The message's headers, if any.",
+          "additionalProperties": true
+        }
+      }
+    },
+    "asyncApiInboundMessage": {
+      "type": "object",
+      "title": "AsyncApiInboundMessage",
+      "description": "Represents a message counsumed by an AsyncAPI subscription.",
+      "allOf": [
+        {
+          "$ref": "#/$defs/asyncApiOutboundMessage"
+        }
+      ],
+      "properties": {
+        "correlationId": {
+          "type": "string",
+          "title": "AsyncApiMessageCorrelationId",
+          "description": "The message's correlation id, if any."
+        }
+      }
+    },
+    "asyncApiSubscription": {
+      "type": "object",
+      "title": "AsyncApiSubscription",
+      "description": "An object used to configure the subscription to messages consumed using the target operation.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "filter": {
+          "$ref": "#/$defs/runtimeExpression",
+          "title": "AsyncApiSubscriptionCorrelation",
+          "description": "A runtime expression, if any, used to filter consumed messages."
+        },
+        "consume": {
+          "$ref": "#/$defs/asyncApiMessageConsumptionPolicy",
+          "title": "AsyncApiMessageConsumptionPolicy",
+          "description": "An object used to configure the subscription's message consumption policy."
+        },
+        "foreach": {
+          "$ref": "#/$defs/subscriptionIterator",
+          "title": "AsyncApiSubscriptionIterator",
+          "description": "Configures the iterator, if any, for processing consumed messages(s)."
+        }
+      },
+      "required": [
+        "consume"
+      ]
+    },
+    "asyncApiMessageConsumptionPolicy": {
+      "type": "object",
+      "title": "AsyncApiMessageConsumptionPolicy",
+      "description": "An object used to configure a subscription's message consumption policy.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "for": {
+          "$ref": "#/$defs/duration",
+          "title": "AsyncApiMessageConsumptionPolicyFor",
+          "description": "Specifies the time period over which messages will be consumed."
+        }
+      },
+      "oneOf": [
+        {
+          "properties": {
+            "amount": {
+              "type": "integer",
+              "description": "The amount of (filtered) messages to consume before disposing of the subscription."
+            }
+          },
+          "title": "AsyncApiMessageConsumptionPolicyAmount",
+          "required": [
+            "amount"
+          ]
+        },
+        {
+          "properties": {
+            "while": {
+              "$ref": "#/$defs/runtimeExpression",
+              "description": "A runtime expression evaluated after each consumed (filtered) message to decide if message consumption should continue."
+            }
+          },
+          "title": "AsyncApiMessageConsumptionPolicyWhile",
+          "required": [
+            "while"
+          ]
+        },
+        {
+          "properties": {
+            "until": {
+              "$ref": "#/$defs/runtimeExpression",
+              "description": "A runtime expression evaluated before each consumed (filtered) message to decide if message consumption should continue."
+            }
+          },
+          "title": "AsyncApiMessageConsumptionPolicyUntil",
+          "required": [
+            "until"
+          ]
+        }
+      ]
+    },
+    "subscriptionIterator": {
+      "type": "object",
+      "title": "SubscriptionIterator",
+      "description": "Configures the iteration over each item (event or message) consumed by a subscription.",
+      "unevaluatedProperties": false,
+      "properties": {
+        "item": {
+          "type": "string",
+          "title": "SubscriptionIteratorItem",
+          "description": "The name of the variable used to store the current item being enumerated.",
+          "default": "item"
+        },
+        "at": {
+          "type": "string",
+          "title": "SubscriptionIteratorIndex",
+          "description": "The name of the variable used to store the index of the current item being enumerated.",
+          "default": "index"
+        },
+        "do": {
+          "$ref": "#/$defs/taskList",
+          "title": "SubscriptionIteratorTasks",
+          "description": "The tasks to perform for each consumed item."
+        },
+        "output": {
+          "$ref": "#/$defs/output",
+          "title": "SubscriptionIteratorOutput",
+          "description": "An object, if any, used to customize the item's output and to document its schema."
+        },
+        "export": {
+          "$ref": "#/$defs/export",
+          "title": "SubscriptionIteratorExport",
+          "description": "An object, if any, used to customize the content of the workflow context."
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/lib/generated/schema/workflow.yaml b/src/lib/generated/schema/workflow.yaml
new file mode 100644
index 00000000..70cab19f
--- /dev/null
+++ b/src/lib/generated/schema/workflow.yaml
@@ -0,0 +1,2146 @@
+$id: https://serverlessworkflow.io/schemas/1.0.0/workflow.yaml
+$schema: https://json-schema.org/draft/2020-12/schema
+description: Serverless Workflow DSL - Workflow Schema.
+type: object
+required:
+  - document
+  - do
+properties:
+  document:
+    type: object
+    title: Document
+    description: Documents the workflow.
+    unevaluatedProperties: false
+    properties:
+      dsl:
+        type: string
+        pattern: >-
+          ^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$
+        title: WorkflowDSL
+        description: The version of the DSL used by the workflow.
+      namespace:
+        type: string
+        pattern: ^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$
+        title: WorkflowNamespace
+        description: The workflow's namespace.
+      name:
+        type: string
+        pattern: ^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$
+        title: WorkflowName
+        description: The workflow's name.
+      version:
+        type: string
+        pattern: >-
+          ^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$
+        title: WorkflowVersion
+        description: The workflow's semantic version.
+      title:
+        type: string
+        title: WorkflowTitle
+        description: The workflow's title.
+      summary:
+        type: string
+        title: WorkflowSummary
+        description: The workflow's Markdown summary.
+      tags:
+        type: object
+        title: WorkflowTags
+        description: A key/value mapping of the workflow's tags, if any.
+        additionalProperties: true
+      metadata:
+        type: object
+        title: WorkflowMetadata
+        description: Holds additional information about the workflow.
+        additionalProperties: true
+    required:
+      - dsl
+      - namespace
+      - name
+      - version
+  input:
+    $ref: '#/$defs/input'
+    title: Input
+    description: Configures the workflow's input.
+  use:
+    type: object
+    title: Use
+    description: Defines the workflow's reusable components.
+    unevaluatedProperties: false
+    properties:
+      authentications:
+        type: object
+        title: UseAuthentications
+        description: The workflow's reusable authentication policies.
+        additionalProperties:
+          $ref: '#/$defs/authenticationPolicy'
+      errors:
+        type: object
+        title: UseErrors
+        description: The workflow's reusable errors.
+        additionalProperties:
+          $ref: '#/$defs/error'
+      extensions:
+        type: array
+        title: UseExtensions
+        description: The workflow's extensions.
+        items:
+          type: object
+          title: ExtensionItem
+          minProperties: 1
+          maxProperties: 1
+          additionalProperties:
+            $ref: '#/$defs/extension'
+      functions:
+        type: object
+        title: UseFunctions
+        description: The workflow's reusable functions.
+        additionalProperties:
+          $ref: '#/$defs/task'
+      retries:
+        type: object
+        title: UseRetries
+        description: The workflow's reusable retry policies.
+        additionalProperties:
+          $ref: '#/$defs/retryPolicy'
+      secrets:
+        type: array
+        title: UseSecrets
+        description: The workflow's reusable secrets.
+        items:
+          type: string
+          description: The workflow's secrets.
+      timeouts:
+        type: object
+        title: UseTimeouts
+        description: The workflow's reusable timeouts.
+        additionalProperties:
+          $ref: '#/$defs/timeout'
+      catalogs:
+        type: object
+        title: UseCatalogs
+        description: The workflow's reusable catalogs.
+        additionalProperties:
+          $ref: '#/$defs/catalog'
+  do:
+    $ref: '#/$defs/taskList'
+    title: Do
+    description: Defines the task(s) the workflow must perform.
+  timeout:
+    title: DoTimeout
+    oneOf:
+      - $ref: '#/$defs/timeout'
+        title: TimeoutDefinition
+        description: The workflow's timeout configuration, if any.
+      - type: string
+        title: TimeoutReference
+        description: The name of the workflow's timeout, if any.
+  output:
+    $ref: '#/$defs/output'
+    title: Output
+    description: Configures the workflow's output.
+  schedule:
+    type: object
+    title: Schedule
+    description: Schedules the workflow.
+    unevaluatedProperties: false
+    properties:
+      every:
+        $ref: '#/$defs/duration'
+        title: ScheduleEvery
+        description: >-
+          Specifies the duration of the interval at which the workflow should be
+          executed.
+      cron:
+        type: string
+        title: ScheduleCron
+        description: >-
+          Specifies the schedule using a cron expression, e.g., '0 0 * * *' for
+          daily at midnight.
+      after:
+        $ref: '#/$defs/duration'
+        title: ScheduleAfter
+        description: >-
+          Specifies a delay duration that the workflow must wait before starting
+          again after it completes.
+      'on':
+        $ref: '#/$defs/eventConsumptionStrategy'
+        title: ScheduleOn
+        description: Specifies the events that trigger the workflow execution.
+$defs:
+  taskList:
+    title: TaskList
+    description: List of named tasks to perform.
+    type: array
+    items:
+      type: object
+      title: TaskItem
+      minProperties: 1
+      maxProperties: 1
+      additionalProperties:
+        $ref: '#/$defs/task'
+  taskBase:
+    type: object
+    title: TaskBase
+    description: An object inherited by all tasks.
+    properties:
+      if:
+        type: string
+        title: TaskBaseIf
+        description: >-
+          A runtime expression, if any, used to determine whether or not the
+          task should be run.
+      input:
+        $ref: '#/$defs/input'
+        title: TaskBaseInput
+        description: Configure the task's input.
+      output:
+        $ref: '#/$defs/output'
+        title: TaskBaseOutput
+        description: Configure the task's output.
+      export:
+        $ref: '#/$defs/export'
+        title: TaskBaseExport
+        description: Export task output to context.
+      timeout:
+        title: TaskTimeout
+        oneOf:
+          - $ref: '#/$defs/timeout'
+            title: TaskTimeoutDefinition
+            description: The task's timeout configuration, if any.
+          - type: string
+            title: TaskTimeoutReference
+            description: The name of the task's timeout, if any.
+      then:
+        $ref: '#/$defs/flowDirective'
+        title: TaskBaseThen
+        description: The flow directive to be performed upon completion of the task.
+      metadata:
+        type: object
+        title: TaskMetadata
+        description: Holds additional information about the task.
+        additionalProperties: true
+  task:
+    title: Task
+    description: >-
+      A discrete unit of work that contributes to achieving the overall
+      objectives defined by the workflow.
+    unevaluatedProperties: false
+    oneOf:
+      - $ref: '#/$defs/callTask'
+      - $ref: '#/$defs/doTask'
+      - $ref: '#/$defs/forkTask'
+      - $ref: '#/$defs/emitTask'
+      - $ref: '#/$defs/forTask'
+      - $ref: '#/$defs/listenTask'
+      - $ref: '#/$defs/raiseTask'
+      - $ref: '#/$defs/runTask'
+      - $ref: '#/$defs/setTask'
+      - $ref: '#/$defs/switchTask'
+      - $ref: '#/$defs/tryTask'
+      - $ref: '#/$defs/waitTask'
+  callTask:
+    title: CallTask
+    description: Defines the call to perform.
+    oneOf:
+      - title: CallAsyncAPI
+        description: Defines the AsyncAPI call to perform.
+        $ref: '#/$defs/taskBase'
+        type: object
+        required:
+          - call
+          - with
+        unevaluatedProperties: false
+        properties:
+          call:
+            type: string
+            const: asyncapi
+          with:
+            type: object
+            title: AsyncApiArguments
+            description: The Async API call arguments.
+            properties:
+              document:
+                $ref: '#/$defs/externalResource'
+                title: AsyncAPIDocument
+                description: The document that defines the AsyncAPI operation to call.
+              channel:
+                type: string
+                title: With
+                description: >-
+                  The name of the channel on which to perform the operation.
+                  Used only in case the referenced document uses AsyncAPI
+                  v2.6.0.
+              operation:
+                type: string
+                title: AsyncAPIOperation
+                description: A reference to the AsyncAPI operation to call.
+              server:
+                $ref: '#/$defs/asyncApiServer'
+                title: AsyncAPIServer
+                description: >-
+                  An object used to configure to the server to call the
+                  specified AsyncAPI operation on.
+              protocol:
+                type: string
+                title: AsyncApiProtocol
+                description: The protocol to use to select the target server.
+                enum:
+                  - amqp
+                  - amqp1
+                  - anypointmq
+                  - googlepubsub
+                  - http
+                  - ibmmq
+                  - jms
+                  - kafka
+                  - mercure
+                  - mqtt
+                  - mqtt5
+                  - nats
+                  - pulsar
+                  - redis
+                  - sns
+                  - solace
+                  - sqs
+                  - stomp
+                  - ws
+              message:
+                $ref: '#/$defs/asyncApiOutboundMessage'
+                title: AsyncApiMessage
+                description: >-
+                  An object used to configure the message to publish using the
+                  target operation.
+              subscription:
+                $ref: '#/$defs/asyncApiSubscription'
+                title: AsyncApiSubscription
+                description: >-
+                  An object used to configure the subscription to messages
+                  consumed using the target operation.
+              authentication:
+                $ref: '#/$defs/referenceableAuthenticationPolicy'
+                title: AsyncAPIAuthentication
+                description: >-
+                  The authentication policy, if any, to use when calling the
+                  AsyncAPI operation.
+            oneOf:
+              - required:
+                  - document
+                  - operation
+                  - message
+              - required:
+                  - document
+                  - operation
+                  - subscription
+              - required:
+                  - document
+                  - channel
+                  - message
+              - required:
+                  - document
+                  - channel
+                  - subscription
+            unevaluatedProperties: false
+      - title: CallGRPC
+        description: Defines the GRPC call to perform.
+        $ref: '#/$defs/taskBase'
+        type: object
+        unevaluatedProperties: false
+        required:
+          - call
+          - with
+        properties:
+          call:
+            type: string
+            const: grpc
+          with:
+            type: object
+            title: GRPCArguments
+            description: The GRPC call arguments.
+            properties:
+              proto:
+                $ref: '#/$defs/externalResource'
+                title: WithGRPCProto
+                description: The proto resource that describes the GRPC service to call.
+              service:
+                type: object
+                title: WithGRPCService
+                unevaluatedProperties: false
+                properties:
+                  name:
+                    type: string
+                    title: WithGRPCServiceName
+                    description: The name of the GRPC service to call.
+                  host:
+                    type: string
+                    title: WithGRPCServiceHost
+                    description: The hostname of the GRPC service to call.
+                    pattern: ^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$
+                  port:
+                    type: integer
+                    title: WithGRPCServicePost
+                    description: The port number of the GRPC service to call.
+                    minimum: 0
+                    maximum: 65535
+                  authentication:
+                    $ref: '#/$defs/referenceableAuthenticationPolicy'
+                    title: WithGRPCServiceAuthentication
+                    description: The endpoint's authentication policy, if any.
+                required:
+                  - name
+                  - host
+              method:
+                type: string
+                title: WithGRPCMethod
+                description: The name of the method to call on the defined GRPC service.
+              arguments:
+                type: object
+                title: WithGRPCArguments
+                description: The arguments, if any, to call the method with.
+                additionalProperties: true
+            required:
+              - proto
+              - service
+              - method
+            unevaluatedProperties: false
+      - title: CallHTTP
+        description: Defines the HTTP call to perform.
+        $ref: '#/$defs/taskBase'
+        type: object
+        unevaluatedProperties: false
+        required:
+          - call
+          - with
+        properties:
+          call:
+            type: string
+            const: http
+          with:
+            type: object
+            title: HTTPArguments
+            description: The HTTP call arguments.
+            properties:
+              method:
+                type: string
+                title: HTTPMethod
+                description: The HTTP method of the HTTP request to perform.
+              endpoint:
+                title: HTTPEndpoint
+                description: The HTTP endpoint to send the request to.
+                $ref: '#/$defs/endpoint'
+              headers:
+                type: object
+                title: HTTPHeaders
+                description: >-
+                  A name/value mapping of the headers, if any, of the HTTP
+                  request to perform.
+              body:
+                title: HTTPBody
+                description: The body, if any, of the HTTP request to perform.
+              query:
+                type: object
+                title: HTTPQuery
+                description: >-
+                  A name/value mapping of the query parameters, if any, of the
+                  HTTP request to perform.
+                additionalProperties: true
+              output:
+                type: string
+                title: HTTPOutput
+                description: The http call output format. Defaults to 'content'.
+                enum:
+                  - raw
+                  - content
+                  - response
+              redirect:
+                type: boolean
+                title: HttpRedirect
+                description: >-
+                  Specifies whether redirection status codes (`300–399`) should
+                  be treated as errors.
+            required:
+              - method
+              - endpoint
+            unevaluatedProperties: false
+      - title: CallOpenAPI
+        description: Defines the OpenAPI call to perform.
+        $ref: '#/$defs/taskBase'
+        type: object
+        unevaluatedProperties: false
+        required:
+          - call
+          - with
+        properties:
+          call:
+            type: string
+            const: openapi
+          with:
+            type: object
+            title: OpenAPIArguments
+            description: The OpenAPI call arguments.
+            properties:
+              document:
+                $ref: '#/$defs/externalResource'
+                title: WithOpenAPIDocument
+                description: The document that defines the OpenAPI operation to call.
+              operationId:
+                type: string
+                title: WithOpenAPIOperation
+                description: The id of the OpenAPI operation to call.
+              parameters:
+                type: object
+                title: WithOpenAPIParameters
+                description: >-
+                  A name/value mapping of the parameters of the OpenAPI
+                  operation to call.
+                additionalProperties: true
+              authentication:
+                $ref: '#/$defs/referenceableAuthenticationPolicy'
+                title: WithOpenAPIAuthentication
+                description: >-
+                  The authentication policy, if any, to use when calling the
+                  OpenAPI operation.
+              output:
+                type: string
+                enum:
+                  - raw
+                  - content
+                  - response
+                title: WithOpenAPIOutput
+                description: The http call output format. Defaults to 'content'.
+              redirect:
+                type: boolean
+                title: HttpRedirect
+                description: >-
+                  Specifies whether redirection status codes (`300–399`) should
+                  be treated as errors.
+            required:
+              - document
+              - operationId
+            unevaluatedProperties: false
+      - title: CallFunction
+        description: Defines the function call to perform.
+        $ref: '#/$defs/taskBase'
+        type: object
+        unevaluatedProperties: false
+        required:
+          - call
+        properties:
+          call:
+            type: string
+            not:
+              enum:
+                - asyncapi
+                - grpc
+                - http
+                - openapi
+            description: The name of the function to call.
+          with:
+            type: object
+            title: FunctionArguments
+            description: >-
+              A name/value mapping of the parameters, if any, to call the
+              function with.
+            additionalProperties: true
+  forkTask:
+    type: object
+    $ref: '#/$defs/taskBase'
+    title: ForkTask
+    description: >-
+      Allows workflows to execute multiple tasks concurrently and optionally
+      race them against each other, with a single possible winner, which sets
+      the task's output.
+    unevaluatedProperties: false
+    required:
+      - fork
+    properties:
+      fork:
+        type: object
+        title: ForkTaskConfiguration
+        description: The configuration of the branches to perform concurrently.
+        unevaluatedProperties: false
+        required:
+          - branches
+        properties:
+          branches:
+            $ref: '#/$defs/taskList'
+            title: ForkBranches
+          compete:
+            type: boolean
+            title: ForkCompete
+            description: >-
+              Indicates whether or not the concurrent tasks are racing against
+              each other, with a single possible winner, which sets the
+              composite task's output.
+            default: false
+  doTask:
+    type: object
+    $ref: '#/$defs/taskBase'
+    title: DoTask
+    description: Allows to execute a list of tasks in sequence.
+    unevaluatedProperties: false
+    required:
+      - do
+    properties:
+      do:
+        $ref: '#/$defs/taskList'
+        title: DoTaskConfiguration
+        description: The configuration of the tasks to perform sequentially.
+  emitTask:
+    type: object
+    $ref: '#/$defs/taskBase'
+    title: EmitTask
+    description: >-
+      Allows workflows to publish events to event brokers or messaging systems,
+      facilitating communication and coordination between different components
+      and services.
+    required:
+      - emit
+    unevaluatedProperties: false
+    properties:
+      emit:
+        type: object
+        title: EmitTaskConfiguration
+        description: The configuration of an event's emission.
+        unevaluatedProperties: false
+        properties:
+          event:
+            type: object
+            title: EmitEventDefinition
+            description: The definition of the event to emit.
+            properties:
+              with:
+                $ref: '#/$defs/eventProperties'
+                title: EmitEventWith
+                description: Defines the properties of event to emit.
+                required:
+                  - source
+                  - type
+            additionalProperties: true
+        required:
+          - event
+  forTask:
+    type: object
+    $ref: '#/$defs/taskBase'
+    title: ForTask
+    description: >-
+      Allows workflows to iterate over a collection of items, executing a
+      defined set of subtasks for each item in the collection. This task type is
+      instrumental in handling scenarios such as batch processing, data
+      transformation, and repetitive operations across datasets.
+    required:
+      - for
+      - do
+    unevaluatedProperties: false
+    properties:
+      for:
+        type: object
+        title: ForTaskConfiguration
+        description: The definition of the loop that iterates over a range of values.
+        unevaluatedProperties: false
+        properties:
+          each:
+            type: string
+            title: ForEach
+            description: >-
+              The name of the variable used to store the current item being
+              enumerated.
+            default: item
+          in:
+            type: string
+            title: ForIn
+            description: A runtime expression used to get the collection to enumerate.
+          at:
+            type: string
+            title: ForAt
+            description: >-
+              The name of the variable used to store the index of the current
+              item being enumerated.
+            default: index
+        required:
+          - in
+      while:
+        type: string
+        title: While
+        description: >-
+          A runtime expression that represents the condition, if any, that must
+          be met for the iteration to continue.
+      do:
+        $ref: '#/$defs/taskList'
+        title: ForTaskDo
+  listenTask:
+    type: object
+    $ref: '#/$defs/taskBase'
+    title: ListenTask
+    description: >-
+      Provides a mechanism for workflows to await and react to external events,
+      enabling event-driven behavior within workflow systems.
+    required:
+      - listen
+    unevaluatedProperties: false
+    properties:
+      listen:
+        type: object
+        title: ListenTaskConfiguration
+        description: The configuration of the listener to use.
+        unevaluatedProperties: false
+        properties:
+          to:
+            $ref: '#/$defs/eventConsumptionStrategy'
+            title: ListenTo
+            description: Defines the event(s) to listen to.
+          read:
+            type: string
+            enum:
+              - data
+              - envelope
+              - raw
+            default: data
+            title: ListenAndReadAs
+            description: Specifies how events are read during the listen operation.
+        required:
+          - to
+      foreach:
+        $ref: '#/$defs/subscriptionIterator'
+        title: ListenIterator
+        description: Configures the iterator, if any, for processing consumed event(s).
+  raiseTask:
+    type: object
+    $ref: '#/$defs/taskBase'
+    title: RaiseTask
+    description: Intentionally triggers and propagates errors.
+    required:
+      - raise
+    unevaluatedProperties: false
+    properties:
+      raise:
+        type: object
+        title: RaiseTaskConfiguration
+        description: The definition of the error to raise.
+        unevaluatedProperties: false
+        properties:
+          error:
+            title: RaiseTaskError
+            oneOf:
+              - $ref: '#/$defs/error'
+                title: RaiseErrorDefinition
+                description: Defines the error to raise.
+              - type: string
+                title: RaiseErrorReference
+                description: The name of the error to raise
+        required:
+          - error
+  runTask:
+    type: object
+    $ref: '#/$defs/taskBase'
+    title: RunTask
+    description: >-
+      Provides the capability to execute external containers, shell commands,
+      scripts, or workflows.
+    required:
+      - run
+    unevaluatedProperties: false
+    properties:
+      run:
+        type: object
+        title: RunTaskConfiguration
+        description: The configuration of the process to execute.
+        unevaluatedProperties: false
+        properties:
+          await:
+            type: boolean
+            default: true
+            title: AwaitProcessCompletion
+            description: Whether to await the process completion before continuing.
+          return:
+            type: string
+            title: ProcessReturnType
+            description: Configures the output of the process.
+            enum:
+              - stdout
+              - stderr
+              - code
+              - all
+              - none
+            default: stdout
+        oneOf:
+          - title: RunContainer
+            description: >-
+              Enables the execution of external processes encapsulated within a
+              containerized environment.
+            properties:
+              container:
+                type: object
+                title: Container
+                description: The configuration of the container to run.
+                unevaluatedProperties: false
+                properties:
+                  image:
+                    type: string
+                    title: ContainerImage
+                    description: The name of the container image to run.
+                  name:
+                    type: string
+                    title: ContainerName
+                    description: >-
+                      A runtime expression, if any, used to give specific name
+                      to the container.
+                  command:
+                    type: string
+                    title: ContainerCommand
+                    description: The command, if any, to execute on the container.
+                  ports:
+                    type: object
+                    title: ContainerPorts
+                    description: The container's port mappings, if any.
+                  volumes:
+                    type: object
+                    title: ContainerVolumes
+                    description: The container's volume mappings, if any.
+                  environment:
+                    type: object
+                    title: ContainerEnvironment
+                    description: >-
+                      A key/value mapping of the environment variables, if any,
+                      to use when running the configured process.
+                  lifetime:
+                    $ref: '#/$defs/containerLifetime'
+                    title: ContainerLifetime
+                    description: >-
+                      An object, if any, used to configure the container's
+                      lifetime
+                required:
+                  - image
+            required:
+              - container
+          - title: RunScript
+            description: >-
+              Enables the execution of custom scripts or code within a workflow,
+              empowering workflows to perform specialized logic, data
+              processing, or integration tasks by executing user-defined scripts
+              written in various programming languages.
+            properties:
+              script:
+                type: object
+                title: Script
+                description: The configuration of the script to run.
+                unevaluatedProperties: false
+                properties:
+                  language:
+                    type: string
+                    title: ScriptLanguage
+                    description: The language of the script to run.
+                  arguments:
+                    type: object
+                    title: ScriptArguments
+                    description: >-
+                      A key/value mapping of the arguments, if any, to use when
+                      running the configured script.
+                    additionalProperties: true
+                  environment:
+                    type: object
+                    title: ScriptEnvironment
+                    description: >-
+                      A key/value mapping of the environment variables, if any,
+                      to use when running the configured script process.
+                    additionalProperties: true
+                oneOf:
+                  - title: InlineScript
+                    type: object
+                    description: The script's code.
+                    properties:
+                      code:
+                        type: string
+                        title: InlineScriptCode
+                    required:
+                      - code
+                  - title: ExternalScript
+                    type: object
+                    description: The script's resource.
+                    properties:
+                      source:
+                        $ref: '#/$defs/externalResource'
+                        title: ExternalScriptResource
+                    required:
+                      - source
+                required:
+                  - language
+            required:
+              - script
+          - title: RunShell
+            description: >-
+              Enables the execution of shell commands within a workflow,
+              enabling workflows to interact with the underlying operating
+              system and perform system-level operations, such as file
+              manipulation, environment configuration, or system administration
+              tasks.
+            properties:
+              shell:
+                type: object
+                title: Shell
+                description: The configuration of the shell command to run.
+                unevaluatedProperties: false
+                properties:
+                  command:
+                    type: string
+                    title: ShellCommand
+                    description: The shell command to run.
+                  arguments:
+                    type: object
+                    title: ShellArguments
+                    description: A list of the arguments of the shell command to run.
+                    additionalProperties: true
+                  environment:
+                    type: object
+                    title: ShellEnvironment
+                    description: >-
+                      A key/value mapping of the environment variables, if any,
+                      to use when running the configured process.
+                    additionalProperties: true
+                required:
+                  - command
+            required:
+              - shell
+          - title: RunWorkflow
+            description: >-
+              Enables the invocation and execution of nested workflows within a
+              parent workflow, facilitating modularization, reusability, and
+              abstraction of complex logic or business processes by
+              encapsulating them into standalone workflow units.
+            properties:
+              workflow:
+                type: object
+                title: SubflowConfiguration
+                description: The configuration of the workflow to run.
+                unevaluatedProperties: false
+                properties:
+                  namespace:
+                    type: string
+                    title: SubflowNamespace
+                    description: The namespace the workflow to run belongs to.
+                  name:
+                    type: string
+                    title: SubflowName
+                    description: The name of the workflow to run.
+                  version:
+                    type: string
+                    default: latest
+                    title: SubflowVersion
+                    description: The version of the workflow to run. Defaults to latest.
+                  input:
+                    type: object
+                    title: SubflowInput
+                    description: >-
+                      The data, if any, to pass as input to the workflow to
+                      execute. The value should be validated against the target
+                      workflow's input schema, if specified.
+                    additionalProperties: true
+                required:
+                  - namespace
+                  - name
+                  - version
+            required:
+              - workflow
+  setTask:
+    type: object
+    $ref: '#/$defs/taskBase'
+    title: SetTask
+    description: A task used to set data.
+    required:
+      - set
+    unevaluatedProperties: false
+    properties:
+      set:
+        type: object
+        title: SetTaskConfiguration
+        description: The data to set.
+        minProperties: 1
+        additionalProperties: true
+  switchTask:
+    type: object
+    $ref: '#/$defs/taskBase'
+    title: SwitchTask
+    description: >-
+      Enables conditional branching within workflows, allowing them to
+      dynamically select different paths based on specified conditions or
+      criteria.
+    required:
+      - switch
+    unevaluatedProperties: false
+    properties:
+      switch:
+        type: array
+        title: SwitchTaskConfiguration
+        description: The definition of the switch to use.
+        minItems: 1
+        items:
+          type: object
+          title: SwitchItem
+          minProperties: 1
+          maxProperties: 1
+          additionalProperties:
+            type: object
+            title: SwitchCase
+            description: >-
+              The definition of a case within a switch task, defining a
+              condition and corresponding tasks to execute if the condition is
+              met.
+            unevaluatedProperties: false
+            required:
+              - then
+            properties:
+              when:
+                type: string
+                title: SwitchCaseCondition
+                description: >-
+                  A runtime expression used to determine whether or not the case
+                  matches.
+              then:
+                $ref: '#/$defs/flowDirective'
+                title: SwitchCaseOutcome
+                description: The flow directive to execute when the case matches.
+  tryTask:
+    type: object
+    $ref: '#/$defs/taskBase'
+    title: TryTask
+    description: >-
+      Serves as a mechanism within workflows to handle errors gracefully,
+      potentially retrying failed tasks before proceeding with alternate ones.
+    required:
+      - try
+      - catch
+    unevaluatedProperties: false
+    properties:
+      try:
+        $ref: '#/$defs/taskList'
+        title: TryTaskConfiguration
+        description: The task(s) to perform.
+      catch:
+        type: object
+        title: TryTaskCatch
+        description: The object used to define the errors to catch.
+        unevaluatedProperties: false
+        properties:
+          errors:
+            type: object
+            title: CatchErrors
+            properties:
+              with:
+                $ref: '#/$defs/errorFilter'
+            description: static error filter
+          as:
+            type: string
+            title: CatchAs
+            description: >-
+              The name of the runtime expression variable to save the error as.
+              Defaults to 'error'.
+          when:
+            type: string
+            title: CatchWhen
+            description: >-
+              A runtime expression used to determine whether to catch the
+              filtered error.
+          exceptWhen:
+            type: string
+            title: CatchExceptWhen
+            description: >-
+              A runtime expression used to determine whether not to catch the
+              filtered error.
+          retry:
+            oneOf:
+              - $ref: '#/$defs/retryPolicy'
+                title: RetryPolicyDefinition
+                description: The retry policy to use, if any, when catching errors.
+              - type: string
+                title: RetryPolicyReference
+                description: >-
+                  The name of the retry policy to use, if any, when catching
+                  errors.
+          do:
+            $ref: '#/$defs/taskList'
+            title: TryTaskCatchDo
+            description: The definition of the task(s) to run when catching an error.
+  waitTask:
+    type: object
+    $ref: '#/$defs/taskBase'
+    title: WaitTask
+    description: >-
+      Allows workflows to pause or delay their execution for a specified period
+      of time.
+    required:
+      - wait
+    unevaluatedProperties: false
+    properties:
+      wait:
+        $ref: '#/$defs/duration'
+        title: WaitTaskConfiguration
+        description: The amount of time to wait.
+  flowDirective:
+    title: FlowDirective
+    description: Represents different transition options for a workflow.
+    anyOf:
+      - title: FlowDirectiveEnum
+        type: string
+        enum:
+          - continue
+          - exit
+          - end
+        default: continue
+      - type: string
+  referenceableAuthenticationPolicy:
+    type: object
+    title: ReferenceableAuthenticationPolicy
+    description: Represents a referenceable authentication policy.
+    unevaluatedProperties: false
+    oneOf:
+      - title: AuthenticationPolicyReference
+        description: The reference of the authentication policy to use.
+        properties:
+          use:
+            type: string
+            minLength: 1
+            title: ReferenceableAuthenticationPolicyName
+            description: The name of the authentication policy to use.
+        required:
+          - use
+      - $ref: '#/$defs/authenticationPolicy'
+  secretBasedAuthenticationPolicy:
+    type: object
+    title: SecretBasedAuthenticationPolicy
+    description: Represents an authentication policy based on secrets.
+    unevaluatedProperties: false
+    properties:
+      use:
+        type: string
+        minLength: 1
+        title: SecretBasedAuthenticationPolicyName
+        description: The name of the authentication policy to use.
+    required:
+      - use
+  authenticationPolicy:
+    type: object
+    title: AuthenticationPolicy
+    description: Defines an authentication policy.
+    oneOf:
+      - title: BasicAuthenticationPolicy
+        description: Use basic authentication.
+        properties:
+          basic:
+            type: object
+            title: BasicAuthenticationPolicyConfiguration
+            description: The configuration of the basic authentication policy.
+            unevaluatedProperties: false
+            oneOf:
+              - title: BasicAuthenticationProperties
+                description: Inline configuration of the basic authentication policy.
+                properties:
+                  username:
+                    type: string
+                    description: The username to use.
+                  password:
+                    type: string
+                    description: The password to use.
+                required:
+                  - username
+                  - password
+              - $ref: '#/$defs/secretBasedAuthenticationPolicy'
+                title: BasicAuthenticationPolicySecret
+                description: Secret based configuration of the basic authentication policy.
+        required:
+          - basic
+      - title: BearerAuthenticationPolicy
+        description: Use bearer authentication.
+        properties:
+          bearer:
+            type: object
+            title: BearerAuthenticationPolicyConfiguration
+            description: The configuration of the bearer authentication policy.
+            unevaluatedProperties: false
+            oneOf:
+              - title: BearerAuthenticationProperties
+                description: Inline configuration of the bearer authentication policy.
+                properties:
+                  token:
+                    type: string
+                    description: The bearer token to use.
+                required:
+                  - token
+              - $ref: '#/$defs/secretBasedAuthenticationPolicy'
+                title: BearerAuthenticationPolicySecret
+                description: >-
+                  Secret based configuration of the bearer authentication
+                  policy.
+        required:
+          - bearer
+      - title: DigestAuthenticationPolicy
+        description: Use digest authentication.
+        properties:
+          digest:
+            type: object
+            title: DigestAuthenticationPolicyConfiguration
+            description: The configuration of the digest authentication policy.
+            unevaluatedProperties: false
+            oneOf:
+              - title: DigestAuthenticationProperties
+                description: Inline configuration of the digest authentication policy.
+                properties:
+                  username:
+                    type: string
+                    description: The username to use.
+                  password:
+                    type: string
+                    description: The password to use.
+                required:
+                  - username
+                  - password
+              - $ref: '#/$defs/secretBasedAuthenticationPolicy'
+                title: DigestAuthenticationPolicySecret
+                description: >-
+                  Secret based configuration of the digest authentication
+                  policy.
+        required:
+          - digest
+      - title: OAuth2AuthenticationPolicy
+        description: Use OAuth2 authentication.
+        properties:
+          oauth2:
+            type: object
+            title: OAuth2AuthenticationPolicyConfiguration
+            description: The configuration of the OAuth2 authentication policy.
+            unevaluatedProperties: false
+            oneOf:
+              - type: object
+                title: OAuth2ConnectAuthenticationProperties
+                description: The inline configuration of the OAuth2 authentication policy.
+                unevaluatedProperties: false
+                allOf:
+                  - $ref: '#/$defs/oauth2AuthenticationProperties'
+                  - type: object
+                    properties:
+                      endpoints:
+                        type: object
+                        title: OAuth2AuthenticationPropertiesEndpoints
+                        description: The endpoint configurations for OAuth2.
+                        properties:
+                          token:
+                            type: string
+                            format: uri-template
+                            default: /oauth2/token
+                            title: OAuth2TokenEndpoint
+                            description: >-
+                              The relative path to the token endpoint. Defaults
+                              to `/oauth2/token`.
+                          revocation:
+                            type: string
+                            format: uri-template
+                            default: /oauth2/revoke
+                            title: OAuth2RevocationEndpoint
+                            description: >-
+                              The relative path to the revocation endpoint.
+                              Defaults to `/oauth2/revoke`.
+                          introspection:
+                            type: string
+                            format: uri-template
+                            default: /oauth2/introspect
+                            title: OAuth2IntrospectionEndpoint
+                            description: >-
+                              The relative path to the introspection endpoint.
+                              Defaults to `/oauth2/introspect`.
+              - $ref: '#/$defs/secretBasedAuthenticationPolicy'
+                title: OAuth2AuthenticationPolicySecret
+                description: >-
+                  Secret based configuration of the OAuth2 authentication
+                  policy.
+        required:
+          - oauth2
+      - title: OpenIdConnectAuthenticationPolicy
+        description: Use OpenIdConnect authentication.
+        properties:
+          oidc:
+            type: object
+            title: OpenIdConnectAuthenticationPolicyConfiguration
+            description: The configuration of the OpenIdConnect authentication policy.
+            unevaluatedProperties: false
+            oneOf:
+              - $ref: '#/$defs/oauth2AuthenticationProperties'
+                title: OpenIdConnectAuthenticationProperties
+                description: >-
+                  The inline configuration of the OpenIdConnect authentication
+                  policy.
+                unevaluatedProperties: false
+              - $ref: '#/$defs/secretBasedAuthenticationPolicy'
+                title: OpenIdConnectAuthenticationPolicySecret
+                description: >-
+                  Secret based configuration of the OpenIdConnect authentication
+                  policy.
+        required:
+          - oidc
+  oauth2AuthenticationProperties:
+    type: object
+    title: OAuth2AutenthicationData
+    description: Inline configuration of the OAuth2 authentication policy.
+    properties:
+      authority:
+        $ref: '#/$defs/uriTemplate'
+        title: OAuth2AutenthicationDataAuthority
+        description: The URI that references the OAuth2 authority to use.
+      grant:
+        type: string
+        enum:
+          - authorization_code
+          - client_credentials
+          - password
+          - refresh_token
+          - urn:ietf:params:oauth:grant-type:token-exchange
+        title: OAuth2AutenthicationDataGrant
+        description: The grant type to use.
+      client:
+        type: object
+        title: OAuth2AutenthicationDataClient
+        description: The definition of an OAuth2 client.
+        unevaluatedProperties: false
+        properties:
+          id:
+            type: string
+            title: ClientId
+            description: The client id to use.
+          secret:
+            type: string
+            title: ClientSecret
+            description: The client secret to use, if any.
+          assertion:
+            type: string
+            title: ClientAssertion
+            description: >-
+              A JWT containing a signed assertion with your application
+              credentials.
+          authentication:
+            type: string
+            enum:
+              - client_secret_basic
+              - client_secret_post
+              - client_secret_jwt
+              - private_key_jwt
+              - none
+            default: client_secret_post
+            title: ClientAuthentication
+            description: The authentication method to use to authenticate the client.
+      request:
+        type: object
+        title: OAuth2TokenRequest
+        description: The configuration of an OAuth2 token request
+        properties:
+          encoding:
+            type: string
+            enum:
+              - application/x-www-form-urlencoded
+              - application/json
+            default: application/x-www-form-urlencoded
+            title: Oauth2TokenRequestEncoding
+      issuers:
+        type: array
+        title: OAuth2Issuers
+        description: >-
+          A list that contains that contains valid issuers that will be used to
+          check against the issuer of generated tokens.
+        items:
+          type: string
+      scopes:
+        type: array
+        title: OAuth2AutenthicationDataScopes
+        description: The scopes, if any, to request the token for.
+        items:
+          type: string
+      audiences:
+        type: array
+        title: OAuth2AutenthicationDataAudiences
+        description: The audiences, if any, to request the token for.
+        items:
+          type: string
+      username:
+        type: string
+        title: OAuth2AutenthicationDataUsername
+        description: The username to use. Used only if the grant type is Password.
+      password:
+        type: string
+        title: OAuth2AutenthicationDataPassword
+        description: The password to use. Used only if the grant type is Password.
+      subject:
+        $ref: '#/$defs/oauth2Token'
+        title: OAuth2AutenthicationDataSubject
+        description: >-
+          The security token that represents the identity of the party on behalf
+          of whom the request is being made.
+      actor:
+        $ref: '#/$defs/oauth2Token'
+        title: OAuth2AutenthicationDataActor
+        description: The security token that represents the identity of the acting party.
+  oauth2Token:
+    type: object
+    title: OAuth2TokenDefinition
+    description: Represents an OAuth2 token.
+    unevaluatedProperties: false
+    properties:
+      token:
+        type: string
+        title: OAuth2Token
+        description: The security token to use.
+      type:
+        type: string
+        title: OAuth2TokenType
+        description: The type of the security token to use.
+    required:
+      - token
+      - type
+  duration:
+    oneOf:
+      - type: object
+        minProperties: 1
+        unevaluatedProperties: false
+        properties:
+          days:
+            type: integer
+            title: DurationDays
+            description: Number of days, if any.
+          hours:
+            type: integer
+            title: DurationHours
+            description: Number of days, if any.
+          minutes:
+            type: integer
+            title: DurationMinutes
+            description: Number of minutes, if any.
+          seconds:
+            type: integer
+            title: DurationSeconds
+            description: Number of seconds, if any.
+          milliseconds:
+            type: integer
+            title: DurationMilliseconds
+            description: Number of milliseconds, if any.
+        title: DurationInline
+        description: The inline definition of a duration.
+      - type: string
+        pattern: >-
+          ^P(?!$)(\d+(?:\.\d+)?Y)?(\d+(?:\.\d+)?M)?(\d+(?:\.\d+)?W)?(\d+(?:\.\d+)?D)?(T(?=\d)(\d+(?:\.\d+)?H)?(\d+(?:\.\d+)?M)?(\d+(?:\.\d+)?S)?)?$
+        title: DurationExpression
+        description: The ISO 8601 expression of a duration.
+  error:
+    type: object
+    title: Error
+    description: Represents an error.
+    unevaluatedProperties: false
+    properties:
+      type:
+        title: ErrorType
+        description: A URI reference that identifies the error type.
+        oneOf:
+          - title: LiteralErrorType
+            $ref: '#/$defs/uriTemplate'
+            description: The literal error type.
+          - title: ExpressionErrorType
+            $ref: '#/$defs/runtimeExpression'
+            description: An expression based error type.
+      status:
+        type: integer
+        title: ErrorStatus
+        description: >-
+          The status code generated by the origin for this occurrence of the
+          error.
+      instance:
+        title: ErrorInstance
+        description: >-
+          A JSON Pointer used to reference the component the error originates
+          from.
+        oneOf:
+          - title: LiteralErrorInstance
+            description: The literal error instance.
+            type: string
+            format: json-pointer
+          - $ref: '#/$defs/runtimeExpression'
+            title: ExpressionErrorInstance
+            description: An expression based error instance.
+      title:
+        type: string
+        title: ErrorTitle
+        description: A short, human-readable summary of the error.
+      detail:
+        type: string
+        title: ErrorDetails
+        description: A human-readable explanation specific to this occurrence of the error.
+    required:
+      - type
+      - status
+  errorFilter:
+    type: object
+    title: ErrorFilter
+    description: >-
+      Error filtering base on static values. For error filtering on dynamic
+      values, use catch.when property
+    minProperties: 1
+    properties:
+      type:
+        type: string
+        description: if present, means this value should be used for filtering
+      status:
+        type: integer
+        description: if present, means this value should be used for filtering
+      instance:
+        type: string
+        description: if present, means this value should be used for filtering
+      title:
+        type: string
+        description: if present, means this value should be used for filtering
+      details:
+        type: string
+        description: if present, means this value should be used for filtering
+  uriTemplate:
+    title: UriTemplate
+    anyOf:
+      - title: LiteralUriTemplate
+        type: string
+        format: uri-template
+        pattern: ^[A-Za-z][A-Za-z0-9+\-.]*://.*
+      - title: LiteralUri
+        type: string
+        format: uri
+        pattern: ^[A-Za-z][A-Za-z0-9+\-.]*://.*
+  endpoint:
+    title: Endpoint
+    description: Represents an endpoint.
+    oneOf:
+      - $ref: '#/$defs/runtimeExpression'
+      - $ref: '#/$defs/uriTemplate'
+      - title: EndpointConfiguration
+        type: object
+        unevaluatedProperties: false
+        properties:
+          uri:
+            title: EndpointUri
+            description: The endpoint's URI.
+            oneOf:
+              - title: LiteralEndpointURI
+                description: The literal endpoint's URI.
+                $ref: '#/$defs/uriTemplate'
+              - title: ExpressionEndpointURI
+                $ref: '#/$defs/runtimeExpression'
+                description: An expression based endpoint's URI.
+          authentication:
+            $ref: '#/$defs/referenceableAuthenticationPolicy'
+            title: EndpointAuthentication
+            description: The authentication policy to use.
+        required:
+          - uri
+  eventProperties:
+    type: object
+    title: EventProperties
+    description: Describes the properties of an event.
+    properties:
+      id:
+        type: string
+        title: EventId
+        description: The event's unique identifier.
+      source:
+        title: EventSource
+        description: Identifies the context in which an event happened.
+        oneOf:
+          - $ref: '#/$defs/uriTemplate'
+          - $ref: '#/$defs/runtimeExpression'
+      type:
+        type: string
+        title: EventType
+        description: >-
+          This attribute contains a value describing the type of event related
+          to the originating occurrence.
+      time:
+        title: EventTime
+        description: When the event occured.
+        oneOf:
+          - title: LiteralTime
+            type: string
+            format: date-time
+          - $ref: '#/$defs/runtimeExpression'
+      subject:
+        type: string
+        title: EventSubject
+        description: The subject of the event.
+      datacontenttype:
+        type: string
+        title: EventDataContentType
+        description: >-
+          Content type of data value. This attribute enables data to carry any
+          type of content, whereby format and encoding might differ from that of
+          the chosen event format.
+      dataschema:
+        title: EventDataschema
+        description: The schema describing the event format.
+        oneOf:
+          - title: LiteralDataSchema
+            $ref: '#/$defs/uriTemplate'
+            description: The literal event data schema.
+          - title: ExpressionDataSchema
+            $ref: '#/$defs/runtimeExpression'
+            description: An expression based event data schema.
+      data:
+        title: EventData
+        description: The event's payload data
+        anyOf:
+          - $ref: '#/$defs/runtimeExpression'
+          - {}
+    additionalProperties: true
+  eventConsumptionStrategy:
+    type: object
+    title: EventConsumptionStrategy
+    description: Describe the event consumption strategy to adopt.
+    unevaluatedProperties: false
+    oneOf:
+      - title: AllEventConsumptionStrategy
+        properties:
+          all:
+            type: array
+            title: AllEventConsumptionStrategyConfiguration
+            description: A list containing all the events that must be consumed.
+            items:
+              $ref: '#/$defs/eventFilter'
+        required:
+          - all
+      - title: AnyEventConsumptionStrategy
+        properties:
+          any:
+            type: array
+            title: AnyEventConsumptionStrategyConfiguration
+            description: A list containing any of the events to consume.
+            items:
+              $ref: '#/$defs/eventFilter'
+          until:
+            oneOf:
+              - type: string
+                title: AnyEventUntilCondition
+                description: >-
+                  A runtime expression condition evaluated after consuming an
+                  event and which determines whether or not to continue
+                  listening.
+              - allOf:
+                  - $ref: '#/$defs/eventConsumptionStrategy'
+                    description: >-
+                      The strategy that defines the event(s) to consume to stop
+                      listening.
+                  - properties:
+                      until: false
+                title: AnyEventUntilConsumed
+        required:
+          - any
+      - title: OneEventConsumptionStrategy
+        properties:
+          one:
+            $ref: '#/$defs/eventFilter'
+            title: OneEventConsumptionStrategyConfiguration
+            description: The single event to consume.
+        required:
+          - one
+  eventFilter:
+    type: object
+    title: EventFilter
+    description: >-
+      An event filter is a mechanism used to selectively process or handle
+      events based on predefined criteria, such as event type, source, or
+      specific attributes.
+    unevaluatedProperties: false
+    properties:
+      with:
+        $ref: '#/$defs/eventProperties'
+        minProperties: 1
+        title: WithEvent
+        description: >-
+          An event filter is a mechanism used to selectively process or handle
+          events based on predefined criteria, such as event type, source, or
+          specific attributes.
+      correlate:
+        type: object
+        title: EventFilterCorrelate
+        description: >-
+          A correlation is a link between events and data, established by
+          mapping event attributes to specific data attributes, allowing for
+          coordinated processing or handling based on event characteristics.
+        additionalProperties:
+          type: object
+          properties:
+            from:
+              type: string
+              title: CorrelateFrom
+              description: >-
+                A runtime expression used to extract the correlation value from
+                the filtered event.
+            expect:
+              type: string
+              title: CorrelateExpect
+              description: >-
+                A constant or a runtime expression, if any, used to determine
+                whether or not the extracted correlation value matches
+                expectations. If not set, the first extracted value will be used
+                as the correlation's expectation.
+          required:
+            - from
+    required:
+      - with
+  extension:
+    type: object
+    title: Extension
+    description: The definition of an extension.
+    unevaluatedProperties: false
+    properties:
+      extend:
+        type: string
+        enum:
+          - call
+          - composite
+          - emit
+          - for
+          - listen
+          - raise
+          - run
+          - set
+          - switch
+          - try
+          - wait
+          - all
+        title: ExtensionTarget
+        description: The type of task to extend.
+      when:
+        type: string
+        title: ExtensionCondition
+        description: >-
+          A runtime expression, if any, used to determine whether or not the
+          extension should apply in the specified context.
+      before:
+        $ref: '#/$defs/taskList'
+        title: ExtensionDoBefore
+        description: The task(s) to execute before the extended task, if any.
+      after:
+        $ref: '#/$defs/taskList'
+        title: ExtensionDoAfter
+        description: The task(s) to execute after the extended task, if any.
+    required:
+      - extend
+  externalResource:
+    type: object
+    title: ExternalResource
+    description: Represents an external resource.
+    unevaluatedProperties: false
+    properties:
+      name:
+        type: string
+        title: ExternalResourceName
+        description: The name of the external resource, if any.
+      endpoint:
+        $ref: '#/$defs/endpoint'
+        title: ExternalResourceEndpoint
+        description: The endpoint of the external resource.
+    required:
+      - endpoint
+  input:
+    type: object
+    title: Input
+    description: Configures the input of a workflow or task.
+    unevaluatedProperties: false
+    properties:
+      schema:
+        $ref: '#/$defs/schema'
+        title: InputSchema
+        description: >-
+          The schema used to describe and validate the input of the workflow or
+          task.
+      from:
+        title: InputFrom
+        description: >-
+          A runtime expression, if any, used to mutate and/or filter the input
+          of the workflow or task.
+        oneOf:
+          - type: string
+          - type: object
+  output:
+    type: object
+    title: Output
+    description: Configures the output of a workflow or task.
+    unevaluatedProperties: false
+    properties:
+      schema:
+        $ref: '#/$defs/schema'
+        title: OutputSchema
+        description: >-
+          The schema used to describe and validate the output of the workflow or
+          task.
+      as:
+        title: OutputAs
+        description: >-
+          A runtime expression, if any, used to mutate and/or filter the output
+          of the workflow or task.
+        oneOf:
+          - type: string
+          - type: object
+  export:
+    type: object
+    title: Export
+    description: Set the content of the context. .
+    unevaluatedProperties: false
+    properties:
+      schema:
+        $ref: '#/$defs/schema'
+        title: ExportSchema
+        description: The schema used to describe and validate the workflow context.
+      as:
+        title: ExportAs
+        description: >-
+          A runtime expression, if any, used to export the output data to the
+          context.
+        oneOf:
+          - type: string
+          - type: object
+  retryPolicy:
+    type: object
+    title: RetryPolicy
+    description: Defines a retry policy.
+    unevaluatedProperties: false
+    properties:
+      when:
+        type: string
+        title: RetryWhen
+        description: >-
+          A runtime expression, if any, used to determine whether or not to
+          retry running the task, in a given context.
+      exceptWhen:
+        type: string
+        title: RetryExcepWhen
+        description: >-
+          A runtime expression used to determine whether or not to retry running
+          the task, in a given context.
+      delay:
+        $ref: '#/$defs/duration'
+        title: RetryDelay
+        description: The duration to wait between retry attempts.
+      backoff:
+        type: object
+        title: RetryBackoff
+        description: The retry duration backoff.
+        unevaluatedProperties: false
+        oneOf:
+          - title: ConstantBackoff
+            properties:
+              constant:
+                type: object
+                description: The definition of the constant backoff to use, if any.
+            required:
+              - constant
+          - title: ExponentialBackOff
+            properties:
+              exponential:
+                type: object
+                description: The definition of the exponential backoff to use, if any.
+            required:
+              - exponential
+          - title: LinearBackoff
+            properties:
+              linear:
+                type: object
+                description: The definition of the linear backoff to use, if any.
+            required:
+              - linear
+      limit:
+        type: object
+        title: RetryLimit
+        unevaluatedProperties: false
+        properties:
+          attempt:
+            type: object
+            title: RetryLimitAttempt
+            unevaluatedProperties: false
+            properties:
+              count:
+                type: integer
+                title: RetryLimitAttemptCount
+                description: The maximum amount of retry attempts, if any.
+              duration:
+                $ref: '#/$defs/duration'
+                title: RetryLimitAttemptDuration
+                description: The maximum duration for each retry attempt.
+          duration:
+            $ref: '#/$defs/duration'
+            title: RetryLimitDuration
+            description: The duration limit, if any, for all retry attempts.
+        description: The retry limit, if any.
+      jitter:
+        type: object
+        title: RetryPolicyJitter
+        description: >-
+          The parameters, if any, that control the randomness or variability of
+          the delay between retry attempts.
+        unevaluatedProperties: false
+        properties:
+          from:
+            $ref: '#/$defs/duration'
+            title: RetryPolicyJitterFrom
+            description: The minimum duration of the jitter range.
+          to:
+            $ref: '#/$defs/duration'
+            title: RetryPolicyJitterTo
+            description: The maximum duration of the jitter range.
+        required:
+          - from
+          - to
+  schema:
+    type: object
+    title: Schema
+    description: Represents the definition of a schema.
+    unevaluatedProperties: false
+    properties:
+      format:
+        type: string
+        default: json
+        title: SchemaFormat
+        description: >-
+          The schema's format. Defaults to 'json'. The (optional) version of the
+          format can be set using `{format}:{version}`.
+    oneOf:
+      - title: SchemaInline
+        properties:
+          document:
+            description: The schema's inline definition.
+        required:
+          - document
+      - title: SchemaExternal
+        properties:
+          resource:
+            $ref: '#/$defs/externalResource'
+            title: SchemaExternalResource
+            description: The schema's external resource.
+        required:
+          - resource
+  timeout:
+    type: object
+    title: Timeout
+    description: The definition of a timeout.
+    unevaluatedProperties: false
+    properties:
+      after:
+        $ref: '#/$defs/duration'
+        title: TimeoutAfter
+        description: The duration after which to timeout.
+    required:
+      - after
+  catalog:
+    type: object
+    title: Catalog
+    description: The definition of a resource catalog.
+    unevaluatedProperties: false
+    properties:
+      endpoint:
+        $ref: '#/$defs/endpoint'
+        title: CatalogEndpoint
+        description: The root URL where the catalog is hosted.
+    required:
+      - endpoint
+  runtimeExpression:
+    type: string
+    title: RuntimeExpression
+    description: A runtime expression.
+    pattern: ^\s*\$\{.+\}\s*$
+  containerLifetime:
+    type: object
+    title: ContainerLifetime
+    description: The configuration of a container's lifetime
+    unevaluatedProperties: false
+    properties:
+      cleanup:
+        type: string
+        title: ContainerCleanupPolicy
+        description: The container cleanup policy to use
+        enum:
+          - always
+          - never
+          - eventually
+        default: never
+      after:
+        $ref: '#/$defs/duration'
+        title: ContainerLifetimeDuration
+        description: >-
+          The duration after which to cleanup the container, in case the cleanup
+          policy has been set to 'eventually'
+    required:
+      - cleanup
+    if:
+      properties:
+        cleanup:
+          const: eventually
+    then:
+      required:
+        - after
+    else:
+      not:
+        required:
+          - after
+  processResult:
+    type: object
+    title: ProcessResult
+    description: The object returned by a run task when its return type has been set 'all'.
+    unevaluatedProperties: false
+    properties:
+      code:
+        type: integer
+        title: ProcessExitCode
+        description: The process's exit code.
+      stdout:
+        type: string
+        title: ProcessStandardOutput
+        description: The content of the process's STDOUT.
+      stderr:
+        type: string
+        title: ProcessStandardError
+        description: The content of the process's STDERR.
+    required:
+      - code
+      - stdout
+      - stderr
+  asyncApiServer:
+    type: object
+    title: AsyncApiServer
+    description: Configures the target server of an AsyncAPI operation.
+    unevaluatedProperties: false
+    properties:
+      name:
+        type: string
+        title: AsyncApiServerName
+        description: The target server's name.
+      variables:
+        type: object
+        title: AsyncApiServerVariables
+        description: The target server's variables, if any.
+    required:
+      - name
+  asyncApiOutboundMessage:
+    type: object
+    title: AsyncApiOutboundMessage
+    description: >-
+      An object used to configure the message to publish using the target
+      operation.
+    unevaluatedProperties: false
+    properties:
+      payload:
+        type: object
+        title: AsyncApiMessagePayload
+        description: The message's payload, if any.
+        additionalProperties: true
+      headers:
+        type: object
+        title: AsyncApiMessageHeaders
+        description: The message's headers, if any.
+        additionalProperties: true
+  asyncApiInboundMessage:
+    type: object
+    title: AsyncApiInboundMessage
+    description: Represents a message counsumed by an AsyncAPI subscription.
+    allOf:
+      - $ref: '#/$defs/asyncApiOutboundMessage'
+    properties:
+      correlationId:
+        type: string
+        title: AsyncApiMessageCorrelationId
+        description: The message's correlation id, if any.
+  asyncApiSubscription:
+    type: object
+    title: AsyncApiSubscription
+    description: >-
+      An object used to configure the subscription to messages consumed using
+      the target operation.
+    unevaluatedProperties: false
+    properties:
+      filter:
+        $ref: '#/$defs/runtimeExpression'
+        title: AsyncApiSubscriptionCorrelation
+        description: A runtime expression, if any, used to filter consumed messages.
+      consume:
+        $ref: '#/$defs/asyncApiMessageConsumptionPolicy'
+        title: AsyncApiMessageConsumptionPolicy
+        description: >-
+          An object used to configure the subscription's message consumption
+          policy.
+      foreach:
+        $ref: '#/$defs/subscriptionIterator'
+        title: AsyncApiSubscriptionIterator
+        description: Configures the iterator, if any, for processing consumed messages(s).
+    required:
+      - consume
+  asyncApiMessageConsumptionPolicy:
+    type: object
+    title: AsyncApiMessageConsumptionPolicy
+    description: An object used to configure a subscription's message consumption policy.
+    unevaluatedProperties: false
+    properties:
+      for:
+        $ref: '#/$defs/duration'
+        title: AsyncApiMessageConsumptionPolicyFor
+        description: Specifies the time period over which messages will be consumed.
+    oneOf:
+      - properties:
+          amount:
+            type: integer
+            description: >-
+              The amount of (filtered) messages to consume before disposing of
+              the subscription.
+        title: AsyncApiMessageConsumptionPolicyAmount
+        required:
+          - amount
+      - properties:
+          while:
+            $ref: '#/$defs/runtimeExpression'
+            description: >-
+              A runtime expression evaluated after each consumed (filtered)
+              message to decide if message consumption should continue.
+        title: AsyncApiMessageConsumptionPolicyWhile
+        required:
+          - while
+      - properties:
+          until:
+            $ref: '#/$defs/runtimeExpression'
+            description: >-
+              A runtime expression evaluated before each consumed (filtered)
+              message to decide if message consumption should continue.
+        title: AsyncApiMessageConsumptionPolicyUntil
+        required:
+          - until
+  subscriptionIterator:
+    type: object
+    title: SubscriptionIterator
+    description: >-
+      Configures the iteration over each item (event or message) consumed by a
+      subscription.
+    unevaluatedProperties: false
+    properties:
+      item:
+        type: string
+        title: SubscriptionIteratorItem
+        description: >-
+          The name of the variable used to store the current item being
+          enumerated.
+        default: item
+      at:
+        type: string
+        title: SubscriptionIteratorIndex
+        description: >-
+          The name of the variable used to store the index of the current item
+          being enumerated.
+        default: index
+      do:
+        $ref: '#/$defs/taskList'
+        title: SubscriptionIteratorTasks
+        description: The tasks to perform for each consumed item.
+      output:
+        $ref: '#/$defs/output'
+        title: SubscriptionIteratorOutput
+        description: >-
+          An object, if any, used to customize the item's output and to document
+          its schema.
+      export:
+        $ref: '#/$defs/export'
+        title: SubscriptionIteratorExport
+        description: >-
+          An object, if any, used to customize the content of the workflow
+          context.
diff --git a/src/lib/validation/README.md b/src/lib/generated/validation/README.md
similarity index 100%
rename from src/lib/validation/README.md
rename to src/lib/generated/validation/README.md
diff --git a/src/lib/definitions/metadata.ts b/src/lib/generated/validation/index.ts
similarity index 84%
rename from src/lib/definitions/metadata.ts
rename to src/lib/generated/validation/index.ts
index 9e191da1..75ff46e9 100644
--- a/src/lib/definitions/metadata.ts
+++ b/src/lib/generated/validation/index.ts
@@ -14,10 +14,4 @@
  * limitations under the License.
  */
 
-export class Metadata {
-  constructor(model: any) {
-    Object.assign(this, model);
-  }
-
-  [name: string]: string;
-}
+export { validationPointers } from './validation-pointers';
diff --git a/src/lib/generated/validation/validation-pointers.ts b/src/lib/generated/validation/validation-pointers.ts
new file mode 100644
index 00000000..e6ed926a
--- /dev/null
+++ b/src/lib/generated/validation/validation-pointers.ts
@@ -0,0 +1,257 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*****************************************************************************************
+ *
+ * /!\ This file is computer generated. Any manual modification can and will be lost. /!\
+ *
+ *****************************************************************************************/
+
+/**
+ * A map of type names and their corresponding schema
+ */
+export const validationPointers = {
+  Workflow: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#',
+  AllEventConsumptionStrategy:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/eventConsumptionStrategy/oneOf/0',
+  AllEventConsumptionStrategyConfiguration:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/eventConsumptionStrategy/oneOf/0/properties/all',
+  AnyEventConsumptionStrategy:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/eventConsumptionStrategy/oneOf/1',
+  AnyEventConsumptionStrategyConfiguration:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/eventConsumptionStrategy/oneOf/1/properties/any',
+  AnyEventConsumptionStrategyUntil:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/eventConsumptionStrategy/oneOf/1/properties/until',
+  AnyEventUntilConsumed:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/eventConsumptionStrategy/oneOf/1/properties/until/oneOf/1',
+  AsyncApiArguments:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/callTask/oneOf/0/properties/with',
+  AuthenticationPolicy: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/authenticationPolicy',
+  AuthenticationPolicyReference:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/referenceableAuthenticationPolicy/oneOf/0',
+  BasicAuthenticationPolicy:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/authenticationPolicy/oneOf/0',
+  BasicAuthenticationPolicyConfiguration:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/authenticationPolicy/oneOf/0/properties/basic',
+  BasicAuthenticationProperties:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/authenticationPolicy/oneOf/0/properties/basic/oneOf/0',
+  BearerAuthenticationPolicy:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/authenticationPolicy/oneOf/1',
+  BearerAuthenticationPolicyConfiguration:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/authenticationPolicy/oneOf/1/properties/bearer',
+  BearerAuthenticationProperties:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/authenticationPolicy/oneOf/1/properties/bearer/oneOf/0',
+  CallAsyncAPI: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/callTask/oneOf/0',
+  CallFunction: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/callTask/oneOf/4',
+  CallGRPC: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/callTask/oneOf/1',
+  CallHTTP: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/callTask/oneOf/2',
+  CallOpenAPI: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/callTask/oneOf/3',
+  CallTask: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/callTask',
+  Catalog: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/catalog',
+  CatchErrors:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/tryTask/properties/catch/properties/errors',
+  ConstantBackoff:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/retryPolicy/properties/backoff/oneOf/0',
+  Container:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/runTask/properties/run/oneOf/0/properties/container',
+  ContainerEnvironment:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/runTask/properties/run/oneOf/0/properties/container/properties/environment',
+  ContainerLifetime:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/runTask/properties/run/oneOf/0/properties/container/properties/lifetime',
+  ContainerPorts:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/runTask/properties/run/oneOf/0/properties/container/properties/ports',
+  ContainerVolumes:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/runTask/properties/run/oneOf/0/properties/container/properties/volumes',
+  DigestAuthenticationPolicy:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/authenticationPolicy/oneOf/2',
+  DigestAuthenticationPolicyConfiguration:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/authenticationPolicy/oneOf/2/properties/digest',
+  DigestAuthenticationProperties:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/authenticationPolicy/oneOf/2/properties/digest/oneOf/0',
+  Document: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/properties/document',
+  DoTask: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/doTask',
+  Duration: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/duration',
+  DurationInline: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/duration/oneOf/0',
+  EmitEventDefinition:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/emitTask/properties/emit/properties/event',
+  EmitEventWith:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/emitTask/properties/emit/properties/event/properties/with',
+  EmitTask: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/emitTask',
+  EmitTaskConfiguration: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/emitTask/properties/emit',
+  Endpoint: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/endpoint',
+  EndpointConfiguration: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/endpoint/oneOf/2',
+  EndpointUri: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/endpoint/oneOf/2/properties/uri',
+  Error: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/error',
+  ErrorFilter: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/errorFilter',
+  ErrorInstance: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/error/properties/instance',
+  ErrorType: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/error/properties/type',
+  EventConsumptionStrategy: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/eventConsumptionStrategy',
+  EventData: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/eventProperties/properties/data',
+  EventDataschema:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/eventProperties/properties/dataschema',
+  EventFilter: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/eventFilter',
+  EventFilterCorrelate:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/eventFilter/properties/correlate',
+  EventSource: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/eventProperties/properties/source',
+  EventTime: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/eventProperties/properties/time',
+  ExponentialBackOff:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/retryPolicy/properties/backoff/oneOf/1',
+  Export: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/export',
+  ExportAs: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/export/properties/as',
+  Extension: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/extension',
+  ExtensionItem:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/properties/use/properties/extensions/items',
+  ExternalResource: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/externalResource',
+  ExternalScript:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/runTask/properties/run/oneOf/1/properties/script/oneOf/1',
+  FlowDirective: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/flowDirective',
+  ForkTask: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/forkTask',
+  ForkTaskConfiguration: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/forkTask/properties/fork',
+  ForTask: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/forTask',
+  ForTaskConfiguration: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/forTask/properties/for',
+  FunctionArguments:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/callTask/oneOf/4/properties/with',
+  GRPCArguments: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/callTask/oneOf/1/properties/with',
+  HTTPArguments: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/callTask/oneOf/2/properties/with',
+  HTTPBody:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/callTask/oneOf/2/properties/with/properties/body',
+  HTTPHeaders:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/callTask/oneOf/2/properties/with/properties/headers',
+  HTTPQuery:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/callTask/oneOf/2/properties/with/properties/query',
+  InlineScript:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/runTask/properties/run/oneOf/1/properties/script/oneOf/0',
+  Input: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/properties/input',
+  InputFrom: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/input/properties/from',
+  LinearBackoff:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/retryPolicy/properties/backoff/oneOf/2',
+  ListenTask: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/listenTask',
+  ListenTaskConfiguration:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/listenTask/properties/listen',
+  OAuth2AutenthicationData:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/oauth2AuthenticationProperties',
+  OAuth2AutenthicationDataAudiences:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/oauth2AuthenticationProperties/properties/audiences',
+  OAuth2AutenthicationDataClient:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/oauth2AuthenticationProperties/properties/client',
+  OAuth2AutenthicationDataScopes:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/oauth2AuthenticationProperties/properties/scopes',
+  OAuth2AuthenticationPolicy:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/authenticationPolicy/oneOf/3',
+  OAuth2AuthenticationPolicyConfiguration:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/authenticationPolicy/oneOf/3/properties/oauth2',
+  OAuth2AuthenticationPropertiesEndpoints:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/authenticationPolicy/oneOf/3/properties/oauth2/oneOf/0/allOf/1/properties/endpoints',
+  OAuth2ConnectAuthenticationProperties:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/authenticationPolicy/oneOf/3/properties/oauth2/oneOf/0',
+  OAuth2Issuers:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/oauth2AuthenticationProperties/properties/issuers',
+  OAuth2TokenDefinition: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/oauth2Token',
+  OAuth2TokenRequest:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/oauth2AuthenticationProperties/properties/request',
+  OneEventConsumptionStrategy:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/eventConsumptionStrategy/oneOf/2',
+  OpenAPIArguments: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/callTask/oneOf/3/properties/with',
+  OpenIdConnectAuthenticationPolicy:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/authenticationPolicy/oneOf/4',
+  OpenIdConnectAuthenticationPolicyConfiguration:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/authenticationPolicy/oneOf/4/properties/oidc',
+  OpenIdConnectAuthenticationProperties:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/authenticationPolicy/oneOf/4/properties/oidc/oneOf/0',
+  Output: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/properties/output',
+  OutputAs: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/output/properties/as',
+  RaiseTask: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/raiseTask',
+  RaiseTaskConfiguration: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/raiseTask/properties/raise',
+  RaiseTaskError:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/raiseTask/properties/raise/properties/error',
+  ReferenceableAuthenticationPolicy:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/referenceableAuthenticationPolicy',
+  RetryBackoff: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/retryPolicy/properties/backoff',
+  RetryLimit: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/retryPolicy/properties/limit',
+  RetryLimitAttempt:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/retryPolicy/properties/limit/properties/attempt',
+  RetryPolicy: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/retryPolicy',
+  RetryPolicyJitter: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/retryPolicy/properties/jitter',
+  RunContainer: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/runTask/properties/run/oneOf/0',
+  RunScript: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/runTask/properties/run/oneOf/1',
+  RunShell: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/runTask/properties/run/oneOf/2',
+  RunTask: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/runTask',
+  RunTaskConfiguration: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/runTask/properties/run',
+  RuntimeExpression: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/runtimeExpression',
+  RunWorkflow: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/runTask/properties/run/oneOf/3',
+  Schedule: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/properties/schedule',
+  Schema: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/schema',
+  SchemaExternal: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/schema/oneOf/1',
+  SchemaInline: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/schema/oneOf/0',
+  Script:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/runTask/properties/run/oneOf/1/properties/script',
+  SecretBasedAuthenticationPolicy:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/secretBasedAuthenticationPolicy',
+  SetTask: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/setTask',
+  SetTaskConfiguration: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/setTask/properties/set',
+  Shell:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/runTask/properties/run/oneOf/2/properties/shell',
+  ShellArguments:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/runTask/properties/run/oneOf/2/properties/shell/properties/arguments',
+  ShellEnvironment:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/runTask/properties/run/oneOf/2/properties/shell/properties/environment',
+  SubflowConfiguration:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/runTask/properties/run/oneOf/3/properties/workflow',
+  SubflowInput:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/runTask/properties/run/oneOf/3/properties/workflow/properties/input',
+  SubscriptionIterator: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/subscriptionIterator',
+  SwitchCase:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/switchTask/properties/switch/items/additionalProperties',
+  SwitchItem: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/switchTask/properties/switch/items',
+  SwitchTask: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/switchTask',
+  SwitchTaskConfiguration:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/switchTask/properties/switch',
+  Task: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/task',
+  TaskBase: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/taskBase',
+  TaskBaseIf: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/taskBase/properties/if',
+  TaskItem: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/taskList/items',
+  TaskList: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/taskList',
+  TaskMetadata: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/taskBase/properties/metadata',
+  TaskTimeout: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/taskBase/properties/timeout',
+  Timeout: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/timeout',
+  TryTask: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/tryTask',
+  TryTaskCatch: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/tryTask/properties/catch',
+  TryTaskCatchRetry:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/tryTask/properties/catch/properties/retry',
+  UriTemplate: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/uriTemplate',
+  Use: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/properties/use',
+  UseAuthentications:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/properties/use/properties/authentications',
+  UseCatalogs: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/properties/use/properties/catalogs',
+  UseErrors: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/properties/use/properties/errors',
+  UseExtensions: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/properties/use/properties/extensions',
+  UseFunctions: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/properties/use/properties/functions',
+  UseRetries: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/properties/use/properties/retries',
+  UseSecrets: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/properties/use/properties/secrets',
+  UseTimeouts: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/properties/use/properties/timeouts',
+  WaitTask: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/waitTask',
+  WithEvent: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/eventFilter/properties/with',
+  WithGRPCArguments:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/callTask/oneOf/1/properties/with/properties/arguments',
+  WithGRPCService:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/callTask/oneOf/1/properties/with/properties/service',
+  WithOpenAPIParameters:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/$defs/callTask/oneOf/3/properties/with/properties/parameters',
+  WorkflowMetadata:
+    'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/properties/document/properties/metadata',
+  WorkflowTags: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/properties/document/properties/tags',
+  WorkflowTimeout: 'https://serverlessworkflow.io/schemas/1.0.0/workflow.json#/properties/timeout',
+};
diff --git a/src/lib/graph-builder.ts b/src/lib/graph-builder.ts
new file mode 100644
index 00000000..ef2d6c0f
--- /dev/null
+++ b/src/lib/graph-builder.ts
@@ -0,0 +1,584 @@
+import {
+  CallTask,
+  DoTask,
+  EmitTask,
+  ForkTask,
+  ForTask,
+  ListenTask,
+  RaiseTask,
+  RunTask,
+  SetTask,
+  SwitchTask,
+  Task,
+  TaskItem,
+  TryTask,
+  WaitTask,
+  Workflow,
+} from './generated/definitions/specification';
+
+const entrySuffix = '-entry-node';
+const exitSuffix = '-exit-node';
+
+const rooId = 'root';
+
+const doReference = '/do';
+const forReference = '/for';
+const catchReference = '/catch';
+const branchReference = '/fork/branches';
+const tryReference = '/try';
+
+/**
+ * Represents a generic within a graph.
+ * This serves as a base type for nodes, edges, and graphs.
+ */
+export type GraphElement = {
+  /** A unique identifier for this graph element. */
+  id: string;
+  /** An optional label to provide additional context or naming. */
+  label?: string | null;
+};
+
+/**
+ * Enumeration of possible node types in a graph.
+ */
+export enum GraphNodeType {
+  Root = 'root',
+  Start = 'start',
+  End = 'end',
+  Entry = 'entry',
+  Exit = 'exit',
+  Call = 'call',
+  Catch = 'catch',
+  Do = 'do',
+  Emit = 'emit',
+  For = 'for',
+  Fork = 'fork',
+  Listen = 'listen',
+  Raise = 'raise',
+  Run = 'run',
+  Set = 'set',
+  Switch = 'switch',
+  Try = 'try',
+  TryCatch = 'try-catch',
+  Wait = 'wait',
+}
+
+/**
+ * Represents a node within the graph.
+ */
+export type GraphNode = GraphElement & {
+  /** The type of the node. */
+  type: GraphNodeType;
+};
+
+/**
+ * Represents a directed edge connecting two nodes in the graph.
+ */
+export type GraphEdge = GraphElement & {
+  /** The unique identifier of the node where the edge originates. */
+  sourceId: string;
+  /** The unique identifier of the node where the edge terminates. */
+  destinationId: string;
+};
+
+/**
+ * Represents a graph or a subgraph
+ */
+export type Graph = GraphNode & {
+  /** The parent graph if this is a subgraph, otherwise null. */
+  parent?: Graph | null;
+  /** A collection of nodes that belong to this graph. */
+  nodes: GraphNode[];
+  /** A collection of edges that define relationships between nodes. */
+  edges: GraphEdge[];
+  /** The entry node of the graph. */
+  entryNode: GraphNode;
+  /** The exit node of the graph. */
+  exitNode: GraphNode;
+};
+
+/**
+ * Context information used when processing tasks in a workflow graph.
+ */
+type TaskContext = {
+  graph: Graph;
+  reference: string;
+  taskList: Map;
+  taskName?: string | null;
+  taskReference: string;
+};
+
+/**
+ * Identity information for a transition between tasks.
+ */
+type TransitionInfo = {
+  /** Name of the task to transition to. */
+  name: string;
+  /** Index position in the task list. */
+  index: number;
+  /** Optional reference to the associated task. */
+  task?: Task;
+  /** Optional label of the transition */
+  label?: string;
+};
+
+/**
+ * Enumeration of possible workflow flow directives.
+ */
+enum FlowDirective {
+  Exit = 'exit',
+  End = 'end',
+  Continue = 'continue',
+}
+
+/**
+ * Converts an array of TaskItem objects into a Map for easy lookup.
+ *
+ * @param tasksList An array of TaskItem objects.
+ * @returns A map where keys are task names and values are Task objects.
+ */
+function mapTasks(tasksList: TaskItem[] | null | undefined): Map {
+  return (tasksList || []).reduce((acc, item) => {
+    const [key, task] = Object.entries(item)[0];
+    acc.set(key, task);
+    return acc;
+  }, new Map());
+}
+
+/**
+ * Initializes a graph with default entry and exit nodes.
+ *
+ * @param type The type of the graph node.
+ * @param id Unique identifier for the graph.
+ * @param label Optional label for the graph.
+ * @param parent Optional parent graph if this is a subgraph.
+ * @returns A newly created Graph instance.
+ */
+function initGraph(
+  type: GraphNodeType,
+  id: string = rooId,
+  label: string | null | undefined = undefined,
+  parent: Graph | null | undefined = undefined,
+): Graph {
+  const entryNode: GraphNode = {
+    type: id === rooId ? GraphNodeType.Start : GraphNodeType.Entry,
+    id: `${id}${entrySuffix}`,
+  };
+  const exitNode: GraphNode = {
+    type: id === rooId ? GraphNodeType.End : GraphNodeType.Exit,
+    id: `${id}${exitSuffix}`,
+  };
+  const graph = {
+    id,
+    label,
+    type,
+    parent,
+    entryNode,
+    exitNode,
+    nodes: [entryNode, exitNode],
+    edges: [],
+  };
+  if (parent) parent.nodes.push(graph);
+  return graph;
+}
+
+/**
+ * Constructs a graph representation based on the given workflow.
+ *
+ * @param workflow The workflow to be converted into a graph structure.
+ * @returns A graph representation of the workflow.
+ */
+export function buildGraph(workflow: Workflow): Graph {
+  const graph = initGraph(GraphNodeType.Root);
+  buildTransitions(graph.entryNode, {
+    graph,
+    reference: doReference,
+    taskList: mapTasks(workflow.do),
+    taskReference: doReference,
+  });
+  return graph;
+}
+
+/**
+ * Gets the next task to be executed in the workflow
+ * @param tasksList The list of task to resolve the next task from
+ * @param taskName The current task name, if any
+ * @param transition A specific transition, if any
+ * @returns
+ */
+function getNextTask(
+  tasksList: Map,
+  taskName: string | null | undefined = undefined,
+  transition: string | null | undefined = undefined,
+): TransitionInfo {
+  if (!tasksList?.size) throw new Error('The task list cannot be empty. No tasks list to get the next task from.');
+  const currentTask: Task | undefined = tasksList.get(taskName || '');
+  transition = transition || currentTask?.then || '';
+  if (transition == FlowDirective.End || transition == FlowDirective.Exit) {
+    return {
+      name: transition,
+      index: -1,
+    };
+  }
+  let index: number = 0;
+  if (transition && transition != FlowDirective.Continue) {
+    index = Array.from(tasksList.keys()).indexOf(transition);
+  } else if (currentTask) {
+    index = Array.from(tasksList.values()).indexOf(currentTask) + 1;
+    if (index >= tasksList.size) {
+      return {
+        name: FlowDirective.End,
+        index: -1,
+      };
+    }
+  }
+  const taskEntry = Array.from(tasksList.entries())[index];
+  return {
+    index,
+    name: taskEntry[0],
+    task: taskEntry[1],
+  };
+}
+
+/**
+ * Builds the provided transition from the source node
+ * @param sourceNode The node to build the transition from
+ * @param transition The transition to follow
+ * @param context The context in which the transition is built
+ */
+function buildTransition(sourceNode: GraphNode | Graph, transition: TransitionInfo, context: TaskContext) {
+  const exitAnchor = (sourceNode as Graph).exitNode || sourceNode;
+  if (transition.index != -1) {
+    const destinationNode = buildTaskNode({
+      ...context,
+      taskReference: `${context.reference}/${transition.index}/${transition.name}`,
+      taskName: transition.name,
+    });
+    buildEdge(context.graph, exitAnchor, (destinationNode as Graph).entryNode || destinationNode, transition.label);
+  } else if (transition.name === FlowDirective.Exit) {
+    buildEdge(context.graph, exitAnchor, context.graph.exitNode, transition.label);
+  } else if (transition.name === FlowDirective.End) {
+    buildEdge(context.graph, exitAnchor, context.graph.exitNode, transition.label);
+  } else throw new Error('Invalid transition');
+}
+
+/**
+ * Builds all the possible transitions from the provided node in the provided context
+ * @param sourceNode The node to build the transitions from
+ * @param context The context in which the transitions are built
+ */
+function buildTransitions(sourceNode: GraphNode | Graph, context: TaskContext) {
+  const transitions: TransitionInfo[] = [];
+  let nextTransition = getNextTask(context.taskList, context.taskName);
+  transitions.push(nextTransition);
+  while (nextTransition?.task?.if) {
+    nextTransition.label = nextTransition?.task?.if;
+    nextTransition = getNextTask(context.taskList, nextTransition.name, FlowDirective.Continue);
+    transitions.push(nextTransition);
+  }
+  transitions
+    .filter(
+      (transition, index) =>
+        transitions.findIndex(
+          (t) => t.index === transition.index && t.name === transition.name && t.task === transition.task,
+        ) === index,
+    )
+    .forEach((transition) => buildTransition(sourceNode, transition, context));
+}
+
+/**
+ * Builds a graph representation of a task
+ * @param context The context to build the graph/node for
+ * @returns A graph or node for the provided context
+ */
+function buildTaskNode(context: TaskContext): GraphNode | Graph {
+  const task = context.taskList.get(context.taskName!);
+  if (!task) throw new Error(`Unabled to find the task '${context.taskName}' in the current context`);
+  if (task.call) return buildCallTaskNode(task, context);
+  if (task.catch) return buildTryCatchTaskNode(task, context);
+  if (task.emit) return buildEmitTaskNode(task, context);
+  if (task.for) return buildForTaskNode(task, context);
+  if (task.fork) return buildForkTaskNode(task, context);
+  if (task.listen) return buildListenTaskNode(task, context);
+  if (task.raise) return buildRaiseTaskNode(task, context);
+  if (task.run) return buildRunTaskNode(task, context);
+  if (task.set) return buildSetTaskNode(task, context);
+  if (task.switch) return buildSwitchTaskNode(task, context);
+  if (task.wait) return buildWaitTaskNode(task, context);
+  if (task.do) return buildDoTaskNode(task, context);
+  throw new Error(`Unable to defined task type of task named '${context.taskName}'`);
+}
+
+/**
+ * Builds a graph node with the provided type and context
+ * @param type The type of the node
+ * @param context The context to build the graph node for
+ * @returns A graph node for the provided context
+ */
+function buildGenericTaskNode(type: GraphNodeType, context: TaskContext): GraphNode {
+  const node: GraphNode = {
+    type,
+    id: context.taskReference,
+    label: context.taskName,
+  };
+  context.graph.nodes.push(node);
+  buildTransitions(node, context);
+  return node;
+}
+
+/**
+ * Builds a graph node for the provided call task
+ * @param task The task to build the graph node for
+ * @param context The context to build the graph node for
+ * @returns A graph node for the provided task
+ */
+function buildCallTaskNode(task: CallTask, context: TaskContext): GraphNode {
+  const node = buildGenericTaskNode(GraphNodeType.Call, context);
+  // TODO: add some details about the task?
+  return node;
+}
+
+/**
+ * Builds a graph for the provided do task
+ * @param task The task to build the graph for
+ * @param context The context to build the graph for
+ * @returns A graph for the provided task
+ */
+function buildDoTaskNode(task: DoTask, context: TaskContext): Graph {
+  const subgraph: Graph = initGraph(GraphNodeType.Do, context.taskReference, context.taskName, context.graph);
+  const doContext: TaskContext = {
+    ...context,
+    graph: subgraph,
+    reference: context.taskReference + doReference,
+    taskList: mapTasks(task.do),
+    taskName: null,
+  };
+  buildTransitions(subgraph.entryNode, doContext);
+  buildTransitions(subgraph, context);
+  return subgraph;
+}
+
+/**
+ * Builds a graph node for the provided emit task
+ * @param task The task to build the graph node for
+ * @param context The context to build the graph node for
+ * @returns A graph node for the provided task
+ */
+function buildEmitTaskNode(task: EmitTask, context: TaskContext): GraphNode {
+  const node = buildGenericTaskNode(GraphNodeType.Emit, context);
+  // TODO: add some details about the task?
+  return node;
+}
+
+/**
+ * Builds a graph for the provided for task
+ * @param task The task to build the graph for
+ * @param context The context to build the graph for
+ * @returns A graph for the provided task
+ */
+function buildForTaskNode(task: ForTask, context: TaskContext): Graph {
+  const subgraph: Graph = initGraph(GraphNodeType.For, context.taskReference, context.taskName, context.graph);
+  const forContext: TaskContext = {
+    ...context,
+    graph: subgraph,
+    reference: subgraph.id + forReference + doReference,
+    taskList: mapTasks(task.do),
+    taskName: null,
+  };
+  buildTransitions(subgraph.entryNode, forContext);
+  buildTransitions(subgraph, context);
+  return subgraph;
+}
+
+/**
+ * Builds a graph for the provided fork task
+ * @param task The task to build the graph for
+ * @param context The context to build the graph for
+ * @returns A graph for the provided task
+ */
+function buildForkTaskNode(task: ForkTask, context: TaskContext): Graph {
+  const subgraph: Graph = initGraph(GraphNodeType.Fork, context.taskReference, context.taskName, context.graph);
+  for (let i = 0, c = task.fork?.branches.length || 0; i < c; i++) {
+    const branchItem = task.fork?.branches[i];
+    if (!branchItem) continue;
+    const [branchName] = Object.entries(branchItem)[0];
+    const branchContext: TaskContext = {
+      ...context,
+      graph: subgraph,
+      reference: `${context.taskReference}${branchReference}`,
+      taskList: mapTasks([branchItem]),
+      taskReference: `${context.taskReference}${branchReference}/${i}/${branchName}`,
+      taskName: branchName,
+    };
+    const branchNode = buildTaskNode(branchContext);
+    buildEdge(subgraph, subgraph.entryNode, (branchNode as Graph).entryNode || branchNode);
+    buildEdge(subgraph, (branchNode as Graph).exitNode || branchNode, subgraph.exitNode);
+  }
+  buildTransitions(subgraph, context);
+  return subgraph;
+}
+
+/**
+ * Builds a graph node for the provided listen task
+ * @param task The task to build the graph node for
+ * @param context The context to build the graph node for
+ * @returns A graph node for the provided task
+ */
+function buildListenTaskNode(task: ListenTask, context: TaskContext): GraphNode {
+  const node = buildGenericTaskNode(GraphNodeType.Listen, context);
+  // TODO: add some details about the task?
+  return node;
+}
+
+/**
+ * Builds a graph node for the provided rasie task
+ * @param task The task to build the graph node for
+ * @param context The context to build the graph node for
+ * @returns A graph node for the provided task
+ */
+function buildRaiseTaskNode(task: RaiseTask, context: TaskContext): GraphNode {
+  const node = buildGenericTaskNode(GraphNodeType.Raise, context);
+  // TODO: add some details about the task?
+  return node;
+}
+
+/**
+ * Builds a graph node for the provided run task
+ * @param task The task to build the graph node for
+ * @param context The context to build the graph node for
+ * @returns A graph node for the provided task
+ */
+function buildRunTaskNode(task: RunTask, context: TaskContext): GraphNode {
+  const node = buildGenericTaskNode(GraphNodeType.Run, context);
+  // TODO: add some details about the task?
+  return node;
+}
+
+/**
+ * Builds a graph node for the provided set task
+ * @param task The task to build the graph node for
+ * @param context The context to build the graph node for
+ * @returns A graph node for the provided task
+ */
+function buildSetTaskNode(task: SetTask, context: TaskContext): GraphNode {
+  const node = buildGenericTaskNode(GraphNodeType.Set, context);
+  // TODO: add some details about the task?
+  return node;
+}
+
+/**
+ * Builds a graph node for the provided switch task
+ * @param task The task to build the graph node for
+ * @param context The context to build the graph node for
+ * @returns A graph node for the provided task
+ */
+function buildSwitchTaskNode(task: SwitchTask, context: TaskContext): GraphNode {
+  const node: GraphNode = buildGenericTaskNode(GraphNodeType.Switch, context);
+  let hasDefaultCase = false;
+  task.switch?.forEach((switchItem) => {
+    const [caseName, switchCase] = Object.entries(switchItem)[0];
+    if (!switchCase.when) hasDefaultCase = true;
+    const transition = getNextTask(context.taskList, context.taskName, switchCase.then);
+    transition.label = caseName;
+    buildTransition(node, transition, context);
+  });
+  if (!hasDefaultCase) {
+    buildTransitions(node, context);
+  }
+  return node;
+}
+
+/**
+ * Builds a graph for the provided try/catch task
+ * @param task The task to build the graph for
+ * @param context The context to build the graph for
+ * @returns A graph for the provided task
+ */
+function buildTryCatchTaskNode(task: TryTask, context: TaskContext): Graph {
+  const containerSubgraph: Graph = initGraph(
+    GraphNodeType.TryCatch,
+    context.taskReference,
+    context.taskName,
+    context.graph,
+  );
+  const trySubgraph: Graph = initGraph(
+    GraphNodeType.Try,
+    context.taskReference + tryReference,
+    context.taskName + ' (try)',
+    containerSubgraph,
+  );
+  buildEdge(containerSubgraph, containerSubgraph.entryNode, trySubgraph.entryNode);
+  const tryContext: TaskContext = {
+    ...context,
+    graph: trySubgraph,
+    reference: trySubgraph.id,
+    taskList: mapTasks(task.try),
+    taskName: null,
+  };
+  buildTransitions(trySubgraph.entryNode, tryContext);
+  if (!task.catch?.do?.length) {
+    const catchNode: GraphNode = {
+      type: GraphNodeType.Catch,
+      id: context.taskReference + catchReference,
+      label: context.taskName + ' (catch)',
+    };
+    containerSubgraph.nodes.push(catchNode);
+    buildEdge(containerSubgraph, trySubgraph.exitNode, catchNode);
+    buildEdge(containerSubgraph, catchNode, containerSubgraph.exitNode);
+  } else {
+    const catchSubgraph: Graph = initGraph(
+      GraphNodeType.Catch,
+      context.taskReference + catchReference + doReference,
+      context.taskName + ' (catch)',
+      containerSubgraph,
+    );
+    buildEdge(containerSubgraph, trySubgraph.exitNode, catchSubgraph.entryNode);
+    const catchContext: TaskContext = {
+      ...context,
+      graph: catchSubgraph,
+      reference: catchSubgraph.id,
+      taskList: mapTasks(task.catch.do),
+      taskName: null,
+    };
+    buildTransitions(catchSubgraph.entryNode, catchContext);
+    buildEdge(containerSubgraph, catchSubgraph.exitNode, containerSubgraph.exitNode);
+  }
+  buildTransitions(containerSubgraph, context);
+  return containerSubgraph;
+}
+
+/**
+ * Builds a graph node for the provided wait task
+ * @param task The task to build the graph node for
+ * @param context The context to build the graph node for
+ * @returns A graph node for the provided task
+ */
+function buildWaitTaskNode(task: WaitTask, context: TaskContext): GraphNode {
+  const node = buildGenericTaskNode(GraphNodeType.Wait, context);
+  // TODO: add some details about the task?
+  return node;
+}
+
+/**
+ * Builds an edge between two elements
+ * @param graph The graph element containing the nodes
+ * @param source The origin node
+ * @param destination The destination node
+ * @param label The edge label, if any
+ */
+function buildEdge(graph: Graph, source: GraphNode, destination: GraphNode, label: string = '') {
+  let edge = graph.edges.find((e) => e.sourceId === source.id && e.destinationId === destination.id);
+  if (edge) {
+    if (label) {
+      edge.label = edge.label + (edge.label ? ' / ' : '') + label;
+    }
+    return edge;
+  }
+  edge = {
+    label,
+    id: `${source.id}-${destination.id}${label ? `-${label}` : ''}`,
+    sourceId: source.id,
+    destinationId: destination.id,
+  };
+  graph.edges.push(edge);
+}
diff --git a/src/lib/hooks/index.ts b/src/lib/hooks/index.ts
new file mode 100644
index 00000000..4d11de67
--- /dev/null
+++ b/src/lib/hooks/index.ts
@@ -0,0 +1 @@
+export * from './workflow-hooks';
diff --git a/src/lib/definitions/functionref.ts b/src/lib/hooks/workflow-hooks.ts
similarity index 54%
rename from src/lib/definitions/functionref.ts
rename to src/lib/hooks/workflow-hooks.ts
index 3053000e..7cb819ea 100644
--- a/src/lib/definitions/functionref.ts
+++ b/src/lib/hooks/workflow-hooks.ts
@@ -14,26 +14,18 @@
  * limitations under the License.
  */
 
-import { overwritePropertyAsPlainType } from './utils';
+import { LifecycleHooks } from '../lifecycle-hooks';
+import { Specification } from '../generated/definitions';
 
-export class Functionref {
-  constructor(model: any) {
-    Object.assign(this, model);
-    overwritePropertyAsPlainType('arguments', this);
-  }
+import { schemaVersion } from '../../../package.json';
 
-  /**
-   * Name of the referenced function
-   */
-  refName: string;
-  /**
-   * Function arguments/inputs
-   */
-  arguments?: {
-    [key: string]: any;
-  };
-  /**
-   * Only used if function type is 'graphql'. A string containing a valid GraphQL selection set
-   */
-  selectionSet?: string;
-}
+export const WorkflowHooks = {
+  preValidation(instance) {
+    if (instance?.document?.dsl !== schemaVersion) {
+      throw new Error(
+        `'Workflow' is invalid - The DSL version of the workflow '${instance?.document?.dsl}' doesn't match the supported version of the SDK '${schemaVersion}'.`,
+      );
+    }
+    return;
+  },
+} as LifecycleHooks;
diff --git a/src/lib/hydrator.ts b/src/lib/hydrator.ts
new file mode 100644
index 00000000..ec306d5c
--- /dev/null
+++ b/src/lib/hydrator.ts
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * oUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import { deepCopy, isObject } from './utils';
+
+/**
+ * A base class used for object hydration
+ */
+export class ObjectHydrator {
+  constructor(model?: Partial) {
+    if (isObject(model)) {
+      Object.assign(this, deepCopy(model));
+    }
+  }
+}
+
+/**
+ * A base class used for array hydration
+ */
+export class ArrayHydrator extends Array {
+  constructor(model?: Array | number) {
+    if (!isNaN(model as number)) {
+      super(model as number);
+    } else {
+      super(...((model as Array) || []));
+      if (!model) {
+        model = [];
+      }
+      if (!Array.isArray(model)) {
+        throw new Error('The provided model should be an array');
+      }
+    }
+  }
+}
diff --git a/src/lib/lifecycle-hooks.ts b/src/lib/lifecycle-hooks.ts
new file mode 100644
index 00000000..a63d2b57
--- /dev/null
+++ b/src/lib/lifecycle-hooks.ts
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * oUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import { Specification } from './generated/definitions';
+import { WorkflowHooks } from './hooks';
+
+/**
+ * Represents the possible lifecycle hooks of an instance
+ */
+export type LifecycleHooks = {
+  /**
+   * The hook called at the end of the constructor
+   * @param instance The instance being initialized
+   */
+  constructor?: (instance: T) => void;
+  /**
+   * The hook called before the validation
+   * @param instance A copy instance being validated
+   * @param workflow A workflow instance, used for DSL level validation
+   */
+  preValidation?: (instance: T, workflow?: Partial) => void;
+  /**
+   * The hook called after the validation
+   * @param instance A copy instance being validated
+   * @param workflow A workflow instance, used for DSL level validation
+   */
+  postValidation?: (instance: T, workflow?: Partial) => void;
+  /**
+   * The hook called to normalized the instance
+   * @param instance A copy of the instance to normalize
+   * @returns The normalized instance
+   */
+  normalize?: (instance: T) => T;
+};
+
+/**
+ * A mapping of type names and their lifecycle hooks
+ */
+const registeredHooks: Map> = new Map>();
+
+/**
+ * The function used to register hooks
+ * @param typeName The name of the type to register the hooks for
+ * @param hooks The hooks to register
+ */
+export const registerHooks = (typeName: string, hooks: LifecycleHooks): void => {
+  registeredHooks.set(typeName, hooks);
+};
+
+/**
+ * Gets the lifecylce hook for the provided type, if any
+ * @param typeName The type to get the lifecycle hook for
+ * @returns The lifecycle hook, if any
+ */
+export const getLifecycleHooks = (typeName: string): LifecycleHooks | undefined => {
+  return registeredHooks.get(typeName);
+};
+
+registerHooks('Workflow', WorkflowHooks);
diff --git a/src/lib/mermaid-converter.ts b/src/lib/mermaid-converter.ts
new file mode 100644
index 00000000..5575eee5
--- /dev/null
+++ b/src/lib/mermaid-converter.ts
@@ -0,0 +1,100 @@
+import { Workflow } from './generated/definitions/specification';
+import { buildGraph, Graph, GraphEdge, GraphNode, GraphNodeType } from './graph-builder';
+
+/**
+ * Adds indentation to each line of the provided code
+ * @param code The code to indent
+ * @returns The indented code
+ */
+const indent = (code: string) =>
+  code
+    .split('\n')
+    .map((line) => `    ${line}`)
+    .join('\n');
+
+/**
+ * Converts a graph to Mermaid code
+ * @param graph The graph to convert
+ * @returns The converted graph
+ */
+function convertGraphToCode(graph: Graph): string {
+  const isRoot: boolean = graph.id === 'root';
+  const code = `${isRoot ? 'flowchart TD' : `subgraph ${graph.id} ["${graph.label || graph.id}"]`}
+${indent(graph.nodes.map((node) => convertNodeToCode(node)).join('\n'))}
+${indent(graph.edges.map((edge) => convertEdgeToCode(edge)).join('\n'))}
+${isRoot ? '' : 'end'}`;
+  return code;
+}
+
+/**
+ * Converts a node to Mermaid code
+ * @param node The node to convert
+ * @returns The converted node
+ */
+function convertNodeToCode(node: GraphNode | Graph): string {
+  let code = '';
+  if ((node as Graph).nodes?.length) {
+    code = convertGraphToCode(node as Graph);
+  } else {
+    code = node.id;
+    switch (node.type) {
+      case GraphNodeType.Entry:
+      case GraphNodeType.Exit:
+        code += ':::hidden';
+        break;
+      case GraphNodeType.Start:
+        code += '(( ))'; // alt '@{ shape: circle, label: " "}';
+        break;
+      case GraphNodeType.End:
+        code += '((( )))'; // alt '@{ shape: dbl-circ, label: " "}';
+        break;
+      default:
+        code += `["${node.label}"]`; // alt `@{ label: "${node.label}" }`
+    }
+  }
+  return code;
+}
+
+/**
+ * Converts an edge to Mermaid code
+ * @param edge The edge to convert
+ * @returns The converted edge
+ */
+function convertEdgeToCode(edge: GraphEdge): string {
+  const ignoreEndArrow =
+    !edge.destinationId.startsWith('root') &&
+    (edge.destinationId.endsWith('-entry-node') || edge.destinationId.endsWith('-exit-node'));
+  const code = `${edge.sourceId} ${edge.label ? `--"${edge.label}"` : ''}--${ignoreEndArrow ? '-' : '>'} ${edge.destinationId}`;
+  return code;
+}
+
+/**
+ * Converts the provided workflow to Mermaid code
+ * @param workflow The workflow to convert
+ * @returns The Mermaid diagram
+ */
+export function convertToMermaidCode(workflow: Workflow): string {
+  const graph = buildGraph(workflow);
+  return (
+    convertGraphToCode(graph) +
+    `
+
+classDef hidden display: none;`
+  );
+}
+
+/**
+ * Represents a Mermaid diagram generator for a given workflow.
+ * This class takes a workflow definition and converts it into a Mermaid.js-compatible diagram.
+ */
+export class MermaidDiagram {
+  constructor(private workflow: Workflow) {}
+
+  /**
+   * Generates the Mermaid code representation of the workflow.
+   * @returns The Mermaid diagram source code as a string.
+   */
+  sourceCode(): string {
+    return convertToMermaidCode(this.workflow);
+  }
+}
diff --git a/src/lib/schema/__merged.json b/src/lib/schema/__merged.json
deleted file mode 100644
index b5c9f37f..00000000
--- a/src/lib/schema/__merged.json
+++ /dev/null
@@ -1,2578 +0,0 @@
-{
-  "$id": "https://serverlessworkflow.io/schemas/0.7/workflow.json",
-  "$schema": "http://json-schema.org/draft-07/schema#",
-  "description": "Serverless Workflow specification - workflow schema",
-  "type": "object",
-  "properties": {
-    "id": {
-      "type": "string",
-      "description": "Workflow unique identifier",
-      "minLength": 1
-    },
-    "key": {
-      "type": "string",
-      "description": "Domain-specific workflow identifier",
-      "minLength": 1
-    },
-    "name": {
-      "type": "string",
-      "description": "Workflow name",
-      "minLength": 1
-    },
-    "description": {
-      "type": "string",
-      "description": "Workflow description"
-    },
-    "version": {
-      "type": "string",
-      "description": "Workflow version",
-      "minLength": 1
-    },
-    "annotations": {
-      "type": "array",
-      "description": "List of helpful terms describing the workflows intended purpose, subject areas, or other important qualities",
-      "minItems": 1,
-      "items": {
-        "type": "string"
-      },
-      "additionalItems": false
-    },
-    "dataInputSchema": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "URI of the JSON Schema used to validate the workflow data input",
-          "minLength": 1
-        },
-        {
-          "type": "object",
-          "description": "Workflow data input schema definition",
-          "properties": {
-            "schema": {
-              "type": "string",
-              "description": "URI of the JSON Schema used to validate the workflow data input",
-              "minLength": 1
-            },
-            "failOnValidationErrors": {
-              "type": "boolean",
-              "default": true,
-              "description": "Determines if workflow execution should continue if there are validation errors"
-            }
-          },
-          "additionalProperties": false,
-          "required": [
-            "schema",
-            "failOnValidationErrors"
-          ]
-        }
-      ]
-    },
-    "secrets": {
-      "$ref": "#/definitions/secrets"
-    },
-    "constants": {
-      "oneOf": [
-        {
-          "type": "string",
-          "format": "uri",
-          "description": "URI to a resource containing constants data (json or yaml)"
-        },
-        {
-          "type": "object",
-          "description": "Workflow constants data (object type)"
-        }
-      ]
-    },
-    "start": {
-      "$ref": "#/definitions/startdef"
-    },
-    "specVersion": {
-      "type": "string",
-      "description": "Serverless Workflow schema version",
-      "minLength": 1
-    },
-    "expressionLang": {
-      "type": "string",
-      "description": "Identifies the expression language used for workflow expressions. Default is 'jq'",
-      "default": "jq",
-      "minLength": 1
-    },
-    "timeouts": {
-      "$ref": "#/definitions/timeouts"
-    },
-    "errors": {
-      "$ref": "#/definitions/errors"
-    },
-    "keepActive": {
-      "type": "boolean",
-      "default": false,
-      "description": "If 'true', workflow instances is not terminated when there are no active execution paths. Instance can be terminated via 'terminate end definition' or reaching defined 'workflowExecTimeout'"
-    },
-    "metadata": {
-      "$ref": "#/definitions/metadata"
-    },
-    "events": {
-      "$ref": "#/definitions/events"
-    },
-    "functions": {
-      "$ref": "#/definitions/functions"
-    },
-    "autoRetries": {
-      "type": "boolean",
-      "default": false,
-      "description": "If set to true, actions should automatically be retried on unchecked errors. Default is false"
-    },
-    "retries": {
-      "$ref": "#/definitions/retries"
-    },
-    "auth": {
-      "$ref": "#/definitions/auth"
-    },
-    "states": {
-      "type": "array",
-      "description": "State definitions",
-      "items": {
-        "anyOf": [
-          {
-            "title": "Sleep State",
-            "$ref": "#/definitions/sleepstate"
-          },
-          {
-            "title": "Event State",
-            "$ref": "#/definitions/eventstate"
-          },
-          {
-            "title": "Operation State",
-            "$ref": "#/definitions/operationstate"
-          },
-          {
-            "title": "Parallel State",
-            "$ref": "#/definitions/parallelstate"
-          },
-          {
-            "title": "Switch State",
-            "$ref": "#/definitions/switchstate"
-          },
-          {
-            "title": "Inject State",
-            "$ref": "#/definitions/injectstate"
-          },
-          {
-            "title": "ForEach State",
-            "$ref": "#/definitions/foreachstate"
-          },
-          {
-            "title": "Callback State",
-            "$ref": "#/definitions/callbackstate"
-          }
-        ]
-      },
-      "additionalItems": false,
-      "minItems": 1
-    }
-  },
-  "oneOf": [
-    {
-      "required": [
-        "id",
-        "specVersion",
-        "name",
-        "start",
-        "states"
-      ]
-    },
-    {
-      "required": [
-        "key",
-        "specVersion",
-        "name",
-        "start",
-        "states"
-      ]
-    }
-  ],
-  "definitions": {
-    "sleep": {
-      "type": "object",
-      "properties": {
-        "before": {
-          "type": "string",
-          "description": "Amount of time (ISO 8601 duration format) to sleep before function/subflow invocation. Does not apply if 'eventRef' is defined."
-        },
-        "after": {
-          "type": "string",
-          "description": "Amount of time (ISO 8601 duration format) to sleep after function/subflow invocation. Does not apply if 'eventRef' is defined."
-        }
-      },
-      "oneOf": [
-        {
-          "required": [
-            "before"
-          ]
-        },
-        {
-          "required": [
-            "after"
-          ]
-        },
-        {
-          "required": [
-            "before",
-            "after"
-          ]
-        }
-      ]
-    },
-    "crondef": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Cron expression defining when workflow instances should be created (automatically)",
-          "minLength": 1
-        },
-        {
-          "type": "object",
-          "properties": {
-            "expression": {
-              "type": "string",
-              "description": "Repeating interval (cron expression) describing when the workflow instance should be created",
-              "minLength": 1
-            },
-            "validUntil": {
-              "type": "string",
-              "description": "Specific date and time (ISO 8601 format) when the cron expression invocation is no longer valid"
-            }
-          },
-          "additionalProperties": false,
-          "required": [
-            "expression"
-          ]
-        }
-      ]
-    },
-    "continueasdef": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Unique id of the workflow to be continue execution as. Entire state data is passed as data input to next execution",
-          "minLength": 1
-        },
-        {
-          "type": "object",
-          "properties": {
-            "workflowId": {
-              "type": "string",
-              "description": "Unique id of the workflow to continue execution as"
-            },
-            "version": {
-              "type": "string",
-              "description": "Version of the workflow to continue execution as",
-              "minLength": 1
-            },
-            "data": {
-              "type": [
-                "string",
-                "object"
-              ],
-              "description": "If string type, an expression which selects parts of the states data output to become the workflow data input of continued execution. If object type, a custom object to become the workflow data input of the continued execution"
-            },
-            "workflowExecTimeout": {
-              "$ref": "#/definitions/workflowExecTimeout",
-              "description": "Workflow execution timeout to be used by the workflow continuing execution. Overwrites any specific settings set by that workflow"
-            }
-          },
-          "required": [
-            "workflowId"
-          ]
-        }
-      ]
-    },
-    "transition": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Name of state to transition to",
-          "minLength": 1
-        },
-        {
-          "type": "object",
-          "description": "Function Reference",
-          "properties": {
-            "nextState": {
-              "type": "string",
-              "description": "Name of state to transition to",
-              "minLength": 1
-            },
-            "produceEvents": {
-              "type": "array",
-              "description": "Array of events to be produced before the transition happens",
-              "items": {
-                "type": "object",
-                "$ref": "#/definitions/produceeventdef"
-              },
-              "additionalItems": false
-            },
-            "compensate": {
-              "type": "boolean",
-              "default": false,
-              "description": "If set to true, triggers workflow compensation when before this transition is taken. Default is false"
-            }
-          },
-          "additionalProperties": false,
-          "required": [
-            "nextState"
-          ]
-        }
-      ]
-    },
-    "error": {
-      "type": "object",
-      "properties": {
-        "errorRef": {
-          "type": "string",
-          "description": "Reference to a unique workflow error definition. Used of errorRefs is not used",
-          "minLength": 1
-        },
-        "errorRefs": {
-          "type": "array",
-          "description": "References one or more workflow error definitions. Used if errorRef is not used",
-          "minItems": 1,
-          "items": {
-            "type": "string"
-          },
-          "additionalItems": false
-        },
-        "transition": {
-          "description": "Transition to next state to handle the error.",
-          "$ref": "#/definitions/transition"
-        },
-        "end": {
-          "description": "End workflow execution in case of this error.",
-          "$ref": "#/definitions/end"
-        }
-      },
-      "additionalProperties": false,
-      "oneOf": [
-        {
-          "required": [
-            "errorRef",
-            "transition"
-          ]
-        },
-        {
-          "required": [
-            "errorRef",
-            "end"
-          ]
-        },
-        {
-          "required": [
-            "errorRefs",
-            "transition"
-          ]
-        },
-        {
-          "required": [
-            "errorRefs",
-            "end"
-          ]
-        }
-      ]
-    },
-    "onevents": {
-      "type": "object",
-      "properties": {
-        "eventRefs": {
-          "type": "array",
-          "description": "References one or more unique event names in the defined workflow events",
-          "minItems": 1,
-          "items": {
-            "type": "string"
-          },
-          "additionalItems": false
-        },
-        "actionMode": {
-          "type": "string",
-          "enum": [
-            "sequential",
-            "parallel"
-          ],
-          "description": "Specifies how actions are to be performed (in sequence or in parallel)",
-          "default": "sequential"
-        },
-        "actions": {
-          "type": "array",
-          "description": "Actions to be performed if expression matches",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/action"
-          },
-          "additionalItems": false
-        },
-        "eventDataFilter": {
-          "description": "Event data filter",
-          "$ref": "#/definitions/eventdatafilter"
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "eventRefs"
-      ]
-    },
-    "action": {
-      "type": "object",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Unique action definition name"
-        },
-        "functionRef": {
-          "description": "References a function to be invoked",
-          "$ref": "#/definitions/functionref"
-        },
-        "eventRef": {
-          "description": "References a 'trigger' and 'result' reusable event definitions",
-          "$ref": "#/definitions/eventref"
-        },
-        "subFlowRef": {
-          "description": "References a sub-workflow to invoke",
-          "$ref": "#/definitions/subflowref"
-        },
-        "sleep": {
-          "description": "Defines time periods workflow execution should sleep before / after function execution",
-          "$ref": "#/definitions/sleep"
-        },
-        "retryRef": {
-          "type": "string",
-          "description": "References a defined workflow retry definition. If not defined the default retry policy is assumed"
-        },
-        "nonRetryableErrors": {
-          "type": "array",
-          "description": "List of unique references to defined workflow errors for which the action should not be retried. Used only when `autoRetries` is set to `true`",
-          "minItems": 1,
-          "items": {
-            "type": "string"
-          },
-          "additionalItems": false
-        },
-        "retryableErrors": {
-          "type": "array",
-          "description": "List of unique references to defined workflow errors for which the action should be retried. Used only when `autoRetries` is set to `false`",
-          "minItems": 1,
-          "items": {
-            "type": "string"
-          },
-          "additionalItems": false
-        },
-        "actionDataFilter": {
-          "description": "Action data filter",
-          "$ref": "#/definitions/actiondatafilter"
-        }
-      },
-      "additionalProperties": false,
-      "oneOf": [
-        {
-          "required": [
-            "functionRef"
-          ]
-        },
-        {
-          "required": [
-            "eventRef"
-          ]
-        },
-        {
-          "required": [
-            "subFlowRef"
-          ]
-        }
-      ]
-    },
-    "functionref": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Name of the referenced function",
-          "minLength": 1
-        },
-        {
-          "type": "object",
-          "description": "Function Reference",
-          "properties": {
-            "refName": {
-              "type": "string",
-              "description": "Name of the referenced function"
-            },
-            "arguments": {
-              "type": "object",
-              "description": "Function arguments/inputs"
-            },
-            "selectionSet": {
-              "type": "string",
-              "description": "Only used if function type is 'graphql'. A string containing a valid GraphQL selection set"
-            }
-          },
-          "additionalProperties": false,
-          "required": [
-            "refName"
-          ]
-        }
-      ]
-    },
-    "eventref": {
-      "type": "object",
-      "description": "Event References",
-      "properties": {
-        "triggerEventRef": {
-          "type": "string",
-          "description": "Reference to the unique name of a 'produced' event definition"
-        },
-        "resultEventRef": {
-          "type": "string",
-          "description": "Reference to the unique name of a 'consumed' event definition"
-        },
-        "data": {
-          "type": [
-            "string",
-            "object"
-          ],
-          "description": "If string type, an expression which selects parts of the states data output to become the data (payload) of the event referenced by 'triggerEventRef'. If object type, a custom object to become the data (payload) of the event referenced by 'triggerEventRef'."
-        },
-        "contextAttributes": {
-          "type": "object",
-          "description": "Add additional extension context attributes to the produced event",
-          "additionalProperties": {
-            "type": "string"
-          }
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "triggerEventRef",
-        "resultEventRef"
-      ]
-    },
-    "subflowref": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Unique id of the sub-workflow to be invoked",
-          "minLength": 1
-        },
-        {
-          "type": "object",
-          "description": "Specifies a sub-workflow to be invoked",
-          "properties": {
-            "workflowId": {
-              "type": "string",
-              "description": "Unique id of the sub-workflow to be invoked"
-            },
-            "version": {
-              "type": "string",
-              "description": "Version of the sub-workflow to be invoked",
-              "minLength": 1
-            }
-          },
-          "required": [
-            "workflowId"
-          ]
-        }
-      ]
-    },
-    "branch": {
-      "type": "object",
-      "description": "Branch Definition",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Branch name"
-        },
-        "timeouts": {
-          "type": "object",
-          "description": "State specific timeouts",
-          "properties": {
-            "actionExecTimeout": {
-              "$ref": "#/definitions/actionExecTimeout"
-            },
-            "branchExecTimeout": {
-              "$ref": "#/definitions/branchExecTimeout"
-            }
-          },
-          "required": []
-        },
-        "actions": {
-          "type": "array",
-          "description": "Actions to be executed in this branch",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/action"
-          },
-          "additionalItems": false
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "name",
-        "actions"
-      ]
-    },
-    "sleepstate": {
-      "type": "object",
-      "description": "Causes the workflow execution to sleep for a specified duration",
-      "properties": {
-        "id": {
-          "type": "string",
-          "description": "Unique State id",
-          "minLength": 1
-        },
-        "name": {
-          "type": "string",
-          "description": "State name"
-        },
-        "type": {
-          "type": "string",
-          "const": "sleep",
-          "description": "State type"
-        },
-        "end": {
-          "$ref": "#/definitions/end",
-          "description": "State end definition"
-        },
-        "stateDataFilter": {
-          "description": "State data filter",
-          "$ref": "#/definitions/statedatafilter"
-        },
-        "duration": {
-          "type": "string",
-          "description": "Duration (ISO 8601 duration format) to sleep"
-        },
-        "timeouts": {
-          "type": "object",
-          "description": "State specific timeouts",
-          "properties": {
-            "stateExecTimeout": {
-              "$ref": "#/definitions/stateExecTimeout"
-            }
-          },
-          "required": []
-        },
-        "onErrors": {
-          "type": "array",
-          "description": "States error handling definitions",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/error"
-          },
-          "additionalItems": false
-        },
-        "transition": {
-          "description": "Next transition of the workflow after the workflow sleep",
-          "$ref": "#/definitions/transition"
-        },
-        "compensatedBy": {
-          "type": "string",
-          "minLength": 1,
-          "description": "Unique Name of a workflow state which is responsible for compensation of this state"
-        },
-        "usedForCompensation": {
-          "type": "boolean",
-          "default": false,
-          "description": "If true, this state is used to compensate another state. Default is false"
-        },
-        "metadata": {
-          "$ref": "#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "if": {
-        "properties": {
-          "usedForCompensation": {
-            "const": true
-          }
-        },
-        "required": [
-          "usedForCompensation"
-        ]
-      },
-      "then": {
-        "required": [
-          "name",
-          "type",
-          "duration"
-        ]
-      },
-      "else": {
-        "oneOf": [
-          {
-            "required": [
-              "name",
-              "type",
-              "duration",
-              "end"
-            ]
-          },
-          {
-            "required": [
-              "name",
-              "type",
-              "duration",
-              "transition"
-            ]
-          }
-        ]
-      }
-    },
-    "eventstate": {
-      "type": "object",
-      "description": "This state is used to wait for events from event sources, then consumes them and invoke one or more actions to run in sequence or parallel",
-      "properties": {
-        "id": {
-          "type": "string",
-          "description": "Unique State id",
-          "minLength": 1
-        },
-        "name": {
-          "type": "string",
-          "description": "State name"
-        },
-        "type": {
-          "type": "string",
-          "const": "event",
-          "description": "State type"
-        },
-        "exclusive": {
-          "type": "boolean",
-          "default": true,
-          "description": "If true consuming one of the defined events causes its associated actions to be performed. If false all of the defined events must be consumed in order for actions to be performed"
-        },
-        "onEvents": {
-          "type": "array",
-          "description": "Define the events to be consumed and optional actions to be performed",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/onevents"
-          },
-          "additionalItems": false
-        },
-        "timeouts": {
-          "type": "object",
-          "description": "State specific timeouts",
-          "properties": {
-            "stateExecTimeout": {
-              "$ref": "#/definitions/stateExecTimeout"
-            },
-            "actionExecTimeout": {
-              "$ref": "#/definitions/actionExecTimeout"
-            },
-            "eventTimeout": {
-              "$ref": "#/definitions/eventTimeout"
-            }
-          },
-          "required": []
-        },
-        "stateDataFilter": {
-          "description": "State data filter",
-          "$ref": "#/definitions/statedatafilter"
-        },
-        "onErrors": {
-          "type": "array",
-          "description": "States error handling definitions",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/error"
-          },
-          "additionalItems": false
-        },
-        "transition": {
-          "description": "Next transition of the workflow after all the actions have been performed",
-          "$ref": "#/definitions/transition"
-        },
-        "end": {
-          "$ref": "#/definitions/end",
-          "description": "State end definition"
-        },
-        "compensatedBy": {
-          "type": "string",
-          "minLength": 1,
-          "description": "Unique Name of a workflow state which is responsible for compensation of this state"
-        },
-        "metadata": {
-          "$ref": "#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "oneOf": [
-        {
-          "required": [
-            "name",
-            "type",
-            "onEvents",
-            "end"
-          ]
-        },
-        {
-          "required": [
-            "name",
-            "type",
-            "onEvents",
-            "transition"
-          ]
-        }
-      ]
-    },
-    "operationstate": {
-      "type": "object",
-      "description": "Defines actions be performed. Does not wait for incoming events",
-      "properties": {
-        "id": {
-          "type": "string",
-          "description": "Unique State id",
-          "minLength": 1
-        },
-        "name": {
-          "type": "string",
-          "description": "State name"
-        },
-        "type": {
-          "type": "string",
-          "const": "operation",
-          "description": "State type"
-        },
-        "end": {
-          "$ref": "#/definitions/end",
-          "description": "State end definition"
-        },
-        "stateDataFilter": {
-          "description": "State data filter",
-          "$ref": "#/definitions/statedatafilter"
-        },
-        "actionMode": {
-          "type": "string",
-          "enum": [
-            "sequential",
-            "parallel"
-          ],
-          "description": "Specifies whether actions are performed in sequence or in parallel",
-          "default": "sequential"
-        },
-        "actions": {
-          "type": "array",
-          "description": "Actions to be performed",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/action"
-          }
-        },
-        "timeouts": {
-          "type": "object",
-          "description": "State specific timeouts",
-          "properties": {
-            "stateExecTimeout": {
-              "$ref": "#/definitions/stateExecTimeout"
-            },
-            "actionExecTimeout": {
-              "$ref": "#/definitions/actionExecTimeout"
-            }
-          },
-          "required": []
-        },
-        "onErrors": {
-          "type": "array",
-          "description": "States error handling definitions",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/error"
-          },
-          "additionalItems": false
-        },
-        "transition": {
-          "description": "Next transition of the workflow after all the actions have been performed",
-          "$ref": "#/definitions/transition"
-        },
-        "compensatedBy": {
-          "type": "string",
-          "minLength": 1,
-          "description": "Unique Name of a workflow state which is responsible for compensation of this state"
-        },
-        "usedForCompensation": {
-          "type": "boolean",
-          "default": false,
-          "description": "If true, this state is used to compensate another state. Default is false"
-        },
-        "metadata": {
-          "$ref": "#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "if": {
-        "properties": {
-          "usedForCompensation": {
-            "const": true
-          }
-        },
-        "required": [
-          "usedForCompensation"
-        ]
-      },
-      "then": {
-        "required": [
-          "name",
-          "type",
-          "actions"
-        ]
-      },
-      "else": {
-        "oneOf": [
-          {
-            "required": [
-              "name",
-              "type",
-              "actions",
-              "end"
-            ]
-          },
-          {
-            "required": [
-              "name",
-              "type",
-              "actions",
-              "transition"
-            ]
-          }
-        ]
-      }
-    },
-    "parallelstate": {
-      "type": "object",
-      "description": "Consists of a number of states that are executed in parallel",
-      "properties": {
-        "id": {
-          "type": "string",
-          "description": "Unique State id",
-          "minLength": 1
-        },
-        "name": {
-          "type": "string",
-          "description": "State name"
-        },
-        "type": {
-          "type": "string",
-          "const": "parallel",
-          "description": "State type"
-        },
-        "end": {
-          "$ref": "#/definitions/end",
-          "description": "State end definition"
-        },
-        "stateDataFilter": {
-          "description": "State data filter",
-          "$ref": "#/definitions/statedatafilter"
-        },
-        "timeouts": {
-          "type": "object",
-          "description": "State specific timeouts",
-          "properties": {
-            "stateExecTimeout": {
-              "$ref": "#/definitions/stateExecTimeout"
-            },
-            "branchExecTimeout": {
-              "$ref": "#/definitions/branchExecTimeout"
-            }
-          },
-          "required": []
-        },
-        "branches": {
-          "type": "array",
-          "description": "Branch Definitions",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/branch"
-          },
-          "additionalItems": false
-        },
-        "completionType": {
-          "type": "string",
-          "enum": [
-            "allOf",
-            "atLeast"
-          ],
-          "description": "Option types on how to complete branch execution.",
-          "default": "allOf"
-        },
-        "numCompleted": {
-          "type": [
-            "number",
-            "string"
-          ],
-          "minimum": 0,
-          "minLength": 0,
-          "description": "Used when completionType is set to 'atLeast' to specify the minimum number of branches that must complete before the state will transition."
-        },
-        "onErrors": {
-          "type": "array",
-          "description": "States error handling definitions",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/error"
-          },
-          "additionalItems": false
-        },
-        "transition": {
-          "description": "Next transition of the workflow after all branches have completed execution",
-          "$ref": "#/definitions/transition"
-        },
-        "compensatedBy": {
-          "type": "string",
-          "minLength": 1,
-          "description": "Unique Name of a workflow state which is responsible for compensation of this state"
-        },
-        "usedForCompensation": {
-          "type": "boolean",
-          "default": false,
-          "description": "If true, this state is used to compensate another state. Default is false"
-        },
-        "metadata": {
-          "$ref": "#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "if": {
-        "properties": {
-          "usedForCompensation": {
-            "const": true
-          }
-        },
-        "required": [
-          "usedForCompensation"
-        ]
-      },
-      "then": {
-        "required": [
-          "name",
-          "type",
-          "branches"
-        ]
-      },
-      "else": {
-        "oneOf": [
-          {
-            "required": [
-              "name",
-              "type",
-              "branches",
-              "end"
-            ]
-          },
-          {
-            "required": [
-              "name",
-              "type",
-              "branches",
-              "transition"
-            ]
-          }
-        ]
-      }
-    },
-    "switchstate": {
-      "oneOf": [
-        {
-          "$ref": "#/definitions/databasedswitch"
-        },
-        {
-          "$ref": "#/definitions/eventbasedswitch"
-        }
-      ]
-    },
-    "eventbasedswitch": {
-      "type": "object",
-      "description": "Permits transitions to other states based on events",
-      "properties": {
-        "id": {
-          "type": "string",
-          "description": "Unique State id",
-          "minLength": 1
-        },
-        "name": {
-          "type": "string",
-          "description": "State name"
-        },
-        "type": {
-          "type": "string",
-          "const": "switch",
-          "description": "State type"
-        },
-        "stateDataFilter": {
-          "description": "State data filter",
-          "$ref": "#/definitions/statedatafilter"
-        },
-        "timeouts": {
-          "type": "object",
-          "description": "State specific timeouts",
-          "properties": {
-            "stateExecTimeout": {
-              "$ref": "#/definitions/stateExecTimeout"
-            },
-            "eventTimeout": {
-              "$ref": "#/definitions/eventTimeout"
-            }
-          },
-          "required": []
-        },
-        "eventConditions": {
-          "type": "array",
-          "description": "Defines conditions evaluated against events",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/eventcondition"
-          },
-          "additionalItems": false
-        },
-        "onErrors": {
-          "type": "array",
-          "description": "States error handling definitions",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/error"
-          },
-          "additionalItems": false
-        },
-        "defaultCondition": {
-          "description": "Default transition of the workflow if there is no matching data conditions. Can include a transition or end definition",
-          "$ref": "#/definitions/defaultconditiondef"
-        },
-        "compensatedBy": {
-          "type": "string",
-          "minLength": 1,
-          "description": "Unique Name of a workflow state which is responsible for compensation of this state"
-        },
-        "usedForCompensation": {
-          "type": "boolean",
-          "default": false,
-          "description": "If true, this state is used to compensate another state. Default is false"
-        },
-        "metadata": {
-          "$ref": "#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "name",
-        "type",
-        "eventConditions"
-      ]
-    },
-    "databasedswitch": {
-      "type": "object",
-      "description": "Permits transitions to other states based on data conditions",
-      "properties": {
-        "id": {
-          "type": "string",
-          "description": "Unique State id",
-          "minLength": 1
-        },
-        "name": {
-          "type": "string",
-          "description": "State name"
-        },
-        "type": {
-          "type": "string",
-          "const": "switch",
-          "description": "State type"
-        },
-        "stateDataFilter": {
-          "description": "State data filter",
-          "$ref": "#/definitions/statedatafilter"
-        },
-        "timeouts": {
-          "type": "object",
-          "description": "State specific timeouts",
-          "properties": {
-            "stateExecTimeout": {
-              "$ref": "#/definitions/stateExecTimeout"
-            }
-          },
-          "required": []
-        },
-        "dataConditions": {
-          "type": "array",
-          "description": "Defines conditions evaluated against state data",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/datacondition"
-          },
-          "additionalItems": false
-        },
-        "onErrors": {
-          "type": "array",
-          "description": "States error handling definitions",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/error"
-          },
-          "additionalItems": false
-        },
-        "defaultCondition": {
-          "description": "Default transition of the workflow if there is no matching data conditions. Can include a transition or end definition",
-          "$ref": "#/definitions/defaultconditiondef"
-        },
-        "compensatedBy": {
-          "type": "string",
-          "minLength": 1,
-          "description": "Unique Name of a workflow state which is responsible for compensation of this state"
-        },
-        "usedForCompensation": {
-          "type": "boolean",
-          "default": false,
-          "description": "If true, this state is used to compensate another state. Default is false"
-        },
-        "metadata": {
-          "$ref": "#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "name",
-        "type",
-        "dataConditions"
-      ]
-    },
-    "defaultconditiondef": {
-      "type": "object",
-      "description": "DefaultCondition definition. Can be either a transition or end definition",
-      "properties": {
-        "transition": {
-          "$ref": "#/definitions/transition"
-        },
-        "end": {
-          "$ref": "#/definitions/end"
-        }
-      },
-      "additionalProperties": false,
-      "oneOf": [
-        {
-          "required": [
-            "transition"
-          ]
-        },
-        {
-          "required": [
-            "end"
-          ]
-        }
-      ]
-    },
-    "eventcondition": {
-      "oneOf": [
-        {
-          "$ref": "#/definitions/transitioneventcondition"
-        },
-        {
-          "$ref": "#/definitions/enddeventcondition"
-        }
-      ]
-    },
-    "transitioneventcondition": {
-      "type": "object",
-      "description": "Switch state data event condition",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Event condition name"
-        },
-        "eventRef": {
-          "type": "string",
-          "description": "References an unique event name in the defined workflow events"
-        },
-        "transition": {
-          "description": "Next transition of the workflow if there is valid matches",
-          "$ref": "#/definitions/transition"
-        },
-        "eventDataFilter": {
-          "description": "Event data filter definition",
-          "$ref": "#/definitions/eventdatafilter"
-        },
-        "metadata": {
-          "$ref": "#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "eventRef",
-        "transition"
-      ]
-    },
-    "enddeventcondition": {
-      "type": "object",
-      "description": "Switch state data event condition",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Event condition name"
-        },
-        "eventRef": {
-          "type": "string",
-          "description": "References an unique event name in the defined workflow events"
-        },
-        "end": {
-          "$ref": "#/definitions/end",
-          "description": "Explicit transition to end"
-        },
-        "eventDataFilter": {
-          "description": "Event data filter definition",
-          "$ref": "#/definitions/eventdatafilter"
-        },
-        "metadata": {
-          "$ref": "#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "eventRef",
-        "end"
-      ]
-    },
-    "datacondition": {
-      "oneOf": [
-        {
-          "$ref": "#/definitions/transitiondatacondition"
-        },
-        {
-          "$ref": "#/definitions/enddatacondition"
-        }
-      ]
-    },
-    "transitiondatacondition": {
-      "type": "object",
-      "description": "Switch state data based condition",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Data condition name"
-        },
-        "condition": {
-          "type": "string",
-          "description": "Workflow expression evaluated against state data. Must evaluate to true or false"
-        },
-        "transition": {
-          "description": "Workflow transition if condition is evaluated to true",
-          "$ref": "#/definitions/transition"
-        },
-        "metadata": {
-          "$ref": "#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "condition",
-        "transition"
-      ]
-    },
-    "enddatacondition": {
-      "type": "object",
-      "description": "Switch state data based condition",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Data condition name"
-        },
-        "condition": {
-          "type": "string",
-          "description": "Workflow expression evaluated against state data. Must evaluate to true or false"
-        },
-        "end": {
-          "$ref": "#/definitions/end",
-          "description": "Workflow end definition"
-        },
-        "metadata": {
-          "$ref": "#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "condition",
-        "end"
-      ]
-    },
-    "injectstate": {
-      "type": "object",
-      "description": "Inject static data into state data. Does not perform any actions",
-      "properties": {
-        "id": {
-          "type": "string",
-          "description": "Unique state id",
-          "minLength": 1
-        },
-        "name": {
-          "type": "string",
-          "description": "State name"
-        },
-        "type": {
-          "type": "string",
-          "const": "inject",
-          "description": "State type"
-        },
-        "end": {
-          "$ref": "#/definitions/end",
-          "description": "State end definition"
-        },
-        "data": {
-          "type": "object",
-          "description": "JSON object which can be set as states data input and can be manipulated via filters"
-        },
-        "timeouts": {
-          "type": "object",
-          "description": "State specific timeouts",
-          "properties": {
-            "stateExecTimeout": {
-              "$ref": "#/definitions/stateExecTimeout"
-            }
-          },
-          "required": []
-        },
-        "stateDataFilter": {
-          "description": "State data filter",
-          "$ref": "#/definitions/statedatafilter"
-        },
-        "transition": {
-          "description": "Next transition of the workflow after injection has completed",
-          "$ref": "#/definitions/transition"
-        },
-        "compensatedBy": {
-          "type": "string",
-          "minLength": 1,
-          "description": "Unique Name of a workflow state which is responsible for compensation of this state"
-        },
-        "usedForCompensation": {
-          "type": "boolean",
-          "default": false,
-          "description": "If true, this state is used to compensate another state. Default is false"
-        },
-        "metadata": {
-          "$ref": "#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "if": {
-        "properties": {
-          "usedForCompensation": {
-            "const": true
-          }
-        },
-        "required": [
-          "usedForCompensation"
-        ]
-      },
-      "then": {
-        "required": [
-          "name",
-          "type",
-          "data"
-        ]
-      },
-      "else": {
-        "oneOf": [
-          {
-            "required": [
-              "name",
-              "type",
-              "data",
-              "end"
-            ]
-          },
-          {
-            "required": [
-              "name",
-              "type",
-              "data",
-              "transition"
-            ]
-          }
-        ]
-      }
-    },
-    "foreachstate": {
-      "type": "object",
-      "description": "Execute a set of defined actions or workflows for each element of a data array",
-      "properties": {
-        "id": {
-          "type": "string",
-          "description": "Unique State id",
-          "minLength": 1
-        },
-        "name": {
-          "type": "string",
-          "description": "State name"
-        },
-        "type": {
-          "type": "string",
-          "const": "foreach",
-          "description": "State type"
-        },
-        "end": {
-          "$ref": "#/definitions/end",
-          "description": "State end definition"
-        },
-        "inputCollection": {
-          "type": "string",
-          "description": "Workflow expression selecting an array element of the states data"
-        },
-        "outputCollection": {
-          "type": "string",
-          "description": "Workflow expression specifying an array element of the states data to add the results of each iteration"
-        },
-        "iterationParam": {
-          "type": "string",
-          "description": "Name of the iteration parameter that can be referenced in actions/workflow. For each parallel iteration, this param should contain an unique element of the inputCollection array"
-        },
-        "batchSize": {
-          "type": [
-            "number",
-            "string"
-          ],
-          "minimum": 0,
-          "minLength": 0,
-          "description": "Specifies how many iterations may run in parallel at the same time. Used if 'mode' property is set to 'parallel' (default)"
-        },
-        "actions": {
-          "type": "array",
-          "description": "Actions to be executed for each of the elements of inputCollection",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/action"
-          },
-          "additionalItems": false
-        },
-        "timeouts": {
-          "type": "object",
-          "description": "State specific timeouts",
-          "properties": {
-            "stateExecTimeout": {
-              "$ref": "#/definitions/stateExecTimeout"
-            },
-            "actionExecTimeout": {
-              "$ref": "#/definitions/actionExecTimeout"
-            }
-          },
-          "required": []
-        },
-        "stateDataFilter": {
-          "description": "State data filter",
-          "$ref": "#/definitions/statedatafilter"
-        },
-        "onErrors": {
-          "type": "array",
-          "description": "States error handling definitions",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/error"
-          },
-          "additionalItems": false
-        },
-        "transition": {
-          "description": "Next transition of the workflow after state has completed",
-          "$ref": "#/definitions/transition"
-        },
-        "compensatedBy": {
-          "type": "string",
-          "minLength": 1,
-          "description": "Unique Name of a workflow state which is responsible for compensation of this state"
-        },
-        "usedForCompensation": {
-          "type": "boolean",
-          "default": false,
-          "description": "If true, this state is used to compensate another state. Default is false"
-        },
-        "mode": {
-          "type": "string",
-          "enum": [
-            "sequential",
-            "parallel"
-          ],
-          "description": "Specifies how iterations are to be performed (sequentially or in parallel)",
-          "default": "parallel"
-        },
-        "metadata": {
-          "$ref": "#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "if": {
-        "properties": {
-          "usedForCompensation": {
-            "const": true
-          }
-        },
-        "required": [
-          "usedForCompensation"
-        ]
-      },
-      "then": {
-        "required": [
-          "name",
-          "type",
-          "inputCollection",
-          "iterationParam",
-          "actions"
-        ]
-      },
-      "else": {
-        "oneOf": [
-          {
-            "required": [
-              "name",
-              "type",
-              "inputCollection",
-              "iterationParam",
-              "actions",
-              "end"
-            ]
-          },
-          {
-            "required": [
-              "name",
-              "type",
-              "inputCollection",
-              "iterationParam",
-              "actions",
-              "transition"
-            ]
-          }
-        ]
-      }
-    },
-    "callbackstate": {
-      "type": "object",
-      "description": "This state performs an action, then waits for the callback event that denotes completion of the action",
-      "properties": {
-        "id": {
-          "type": "string",
-          "description": "Unique state id",
-          "minLength": 1
-        },
-        "name": {
-          "type": "string",
-          "description": "State name"
-        },
-        "type": {
-          "type": "string",
-          "const": "callback",
-          "description": "State type"
-        },
-        "action": {
-          "description": "Defines the action to be executed",
-          "$ref": "#/definitions/action"
-        },
-        "eventRef": {
-          "type": "string",
-          "description": "References an unique callback event name in the defined workflow events"
-        },
-        "timeouts": {
-          "type": "object",
-          "description": "State specific timeouts",
-          "properties": {
-            "stateExecTimeout": {
-              "$ref": "#/definitions/stateExecTimeout"
-            },
-            "actionExecTimeout": {
-              "$ref": "#/definitions/actionExecTimeout"
-            },
-            "eventTimeout": {
-              "$ref": "#/definitions/eventTimeout"
-            }
-          },
-          "required": []
-        },
-        "eventDataFilter": {
-          "description": "Event data filter",
-          "$ref": "#/definitions/eventdatafilter"
-        },
-        "stateDataFilter": {
-          "description": "State data filter",
-          "$ref": "#/definitions/statedatafilter"
-        },
-        "onErrors": {
-          "type": "array",
-          "description": "States error handling definitions",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/error"
-          },
-          "additionalItems": false
-        },
-        "transition": {
-          "description": "Next transition of the workflow after all the actions have been performed",
-          "$ref": "#/definitions/transition"
-        },
-        "end": {
-          "$ref": "#/definitions/end",
-          "description": "State end definition"
-        },
-        "compensatedBy": {
-          "type": "string",
-          "minLength": 1,
-          "description": "Unique Name of a workflow state which is responsible for compensation of this state"
-        },
-        "usedForCompensation": {
-          "type": "boolean",
-          "default": false,
-          "description": "If true, this state is used to compensate another state. Default is false"
-        },
-        "metadata": {
-          "$ref": "#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "if": {
-        "properties": {
-          "usedForCompensation": {
-            "const": true
-          }
-        },
-        "required": [
-          "usedForCompensation"
-        ]
-      },
-      "then": {
-        "required": [
-          "name",
-          "type",
-          "action",
-          "eventRef"
-        ]
-      },
-      "else": {
-        "oneOf": [
-          {
-            "required": [
-              "name",
-              "type",
-              "action",
-              "eventRef",
-              "end"
-            ]
-          },
-          {
-            "required": [
-              "name",
-              "type",
-              "action",
-              "eventRef",
-              "transition"
-            ]
-          }
-        ]
-      }
-    },
-    "startdef": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Name of the starting workflow state",
-          "minLength": 1
-        },
-        {
-          "type": "object",
-          "description": "Workflow start definition",
-          "properties": {
-            "stateName": {
-              "type": "string",
-              "description": "Name of the starting workflow state",
-              "minLength": 1
-            },
-            "schedule": {
-              "description": "Define the time/repeating intervals or cron at which workflow instances should be automatically started.",
-              "$ref": "#/definitions/schedule"
-            }
-          },
-          "additionalProperties": false,
-          "required": [
-            "stateName",
-            "schedule"
-          ]
-        }
-      ]
-    },
-    "schedule": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Time interval (must be repeating interval) described with ISO 8601 format. Declares when workflow instances will be automatically created.  (UTC timezone is assumed)",
-          "minLength": 1
-        },
-        {
-          "type": "object",
-          "description": "Start state schedule definition",
-          "properties": {
-            "interval": {
-              "type": "string",
-              "description": "Time interval (must be repeating interval) described with ISO 8601 format. Declares when workflow instances will be automatically created.",
-              "minLength": 1
-            },
-            "cron": {
-              "$ref": "#/definitions/crondef"
-            },
-            "timezone": {
-              "type": "string",
-              "description": "Timezone name used to evaluate the interval & cron-expression. (default: UTC)"
-            }
-          },
-          "additionalProperties": false,
-          "oneOf": [
-            {
-              "required": [
-                "interval"
-              ]
-            },
-            {
-              "required": [
-                "cron"
-              ]
-            }
-          ]
-        }
-      ]
-    },
-    "end": {
-      "oneOf": [
-        {
-          "type": "boolean",
-          "description": "State end definition",
-          "default": true
-        },
-        {
-          "type": "object",
-          "description": "State end definition",
-          "properties": {
-            "terminate": {
-              "type": "boolean",
-              "default": false,
-              "description": "If true, completes all execution flows in the given workflow instance"
-            },
-            "produceEvents": {
-              "type": "array",
-              "description": "Defines events that should be produced",
-              "items": {
-                "type": "object",
-                "$ref": "#/definitions/produceeventdef"
-              },
-              "additionalItems": false
-            },
-            "compensate": {
-              "type": "boolean",
-              "default": false,
-              "description": "If set to true, triggers workflow compensation. Default is false"
-            },
-            "continueAs": {
-              "$ref": "#/definitions/continueasdef"
-            }
-          },
-          "additionalProperties": false,
-          "required": []
-        }
-      ]
-    },
-    "produceeventdef": {
-      "type": "object",
-      "description": "Produce an event and set its data",
-      "properties": {
-        "eventRef": {
-          "type": "string",
-          "description": "References a name of a defined event"
-        },
-        "data": {
-          "type": [
-            "string",
-            "object"
-          ],
-          "description": "If String, expression which selects parts of the states data output to become the data of the produced event. If object a custom object to become the data of produced event."
-        },
-        "contextAttributes": {
-          "type": "object",
-          "description": "Add additional event extension context attributes",
-          "additionalProperties": {
-            "type": "string"
-          }
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "eventRef"
-      ]
-    },
-    "statedatafilter": {
-      "type": "object",
-      "properties": {
-        "input": {
-          "type": "string",
-          "description": "Workflow expression to filter the state data input"
-        },
-        "output": {
-          "type": "string",
-          "description": "Workflow expression that filters the state data output"
-        }
-      },
-      "additionalProperties": false,
-      "required": []
-    },
-    "eventdatafilter": {
-      "type": "object",
-      "properties": {
-        "data": {
-          "type": "string",
-          "description": "Workflow expression that filters the received event/payload (default: '${ . }')"
-        },
-        "toStateData": {
-          "type": "string",
-          "description": " Workflow expression that selects a state data element to which the filtered event should be added/merged into. If not specified, denotes, the top-level state data element."
-        }
-      },
-      "additionalProperties": false,
-      "required": []
-    },
-    "actiondatafilter": {
-      "type": "object",
-      "properties": {
-        "fromStateData": {
-          "type": "string",
-          "description": "Workflow expression that selects state data that the state action can use"
-        },
-        "results": {
-          "type": "string",
-          "description": "Workflow expression that filters the actions data results"
-        },
-        "toStateData": {
-          "type": "string",
-          "description": "Workflow expression that selects a state data element to which the action results should be added/merged into. If not specified, denote, the top-level state data element"
-        }
-      },
-      "additionalProperties": false,
-      "required": []
-    },
-    "workflowExecTimeout": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Workflow execution timeout duration (ISO 8601 duration format). If not specified should be 'unlimited'",
-          "minLength": 1
-        },
-        {
-          "type": "object",
-          "properties": {
-            "duration": {
-              "type": "string",
-              "description": "Workflow execution timeout duration (ISO 8601 duration format). If not specified should be 'unlimited'",
-              "minLength": 1
-            },
-            "interrupt": {
-              "type": "boolean",
-              "description": "If `false`, workflow instance is allowed to finish current execution. If `true`, current workflow execution is abrupted.",
-              "default": true
-            },
-            "runBefore": {
-              "type": "string",
-              "description": "Name of a workflow state to be executed before workflow instance is terminated",
-              "minLength": 1
-            }
-          },
-          "additionalProperties": false,
-          "required": [
-            "duration"
-          ]
-        }
-      ]
-    },
-    "stateExecTimeout": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Total state execution timeout (including retries) (ISO 8601 duration format)",
-          "minLength": 1
-        },
-        {
-          "type": "object",
-          "description": "Workflow default timeouts",
-          "properties": {
-            "single": {
-              "type": "string",
-              "description": "Single state execution timeout, not including retries (ISO 8601 duration format)",
-              "minLength": 1
-            },
-            "total": {
-              "type": "string",
-              "description": "Total state execution timeout, including retries (ISO 8601 duration format)",
-              "minLength": 1
-            }
-          },
-          "additionalProperties": false,
-          "required": [
-            "total"
-          ]
-        }
-      ]
-    },
-    "actionExecTimeout": {
-      "type": "string",
-      "description": "Single actions definition execution timeout duration (ISO 8601 duration format)",
-      "minLength": 1
-    },
-    "branchExecTimeout": {
-      "type": "string",
-      "description": "Single branch execution timeout duration (ISO 8601 duration format)",
-      "minLength": 1
-    },
-    "eventTimeout": {
-      "type": "string",
-      "description": "Timeout duration to wait for consuming defined events (ISO 8601 duration format)",
-      "minLength": 1
-    },
-    "errordef": {
-      "type": "object",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Domain-specific error name",
-          "minLength": 1
-        },
-        "code": {
-          "type": "string",
-          "description": "Error code. Can be used in addition to the name to help runtimes resolve to technical errors/exceptions. Should not be defined if error is set to '*'",
-          "minLength": 1
-        },
-        "description": {
-          "type": "string",
-          "description": "Error description"
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "name"
-      ]
-    },
-    "eventdef": {
-      "type": "object",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Unique event name",
-          "minLength": 1
-        },
-        "source": {
-          "type": "string",
-          "description": "CloudEvent source"
-        },
-        "type": {
-          "type": "string",
-          "description": "CloudEvent type"
-        },
-        "kind": {
-          "type": "string",
-          "enum": [
-            "consumed",
-            "produced"
-          ],
-          "description": "Defines the CloudEvent as either 'consumed' or 'produced' by the workflow. Default is 'consumed'",
-          "default": "consumed"
-        },
-        "correlation": {
-          "type": "array",
-          "description": "CloudEvent correlation definitions",
-          "minItems": 1,
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/correlationDef"
-          },
-          "additionalItems": false
-        },
-        "dataOnly": {
-          "type": "boolean",
-          "default": true,
-          "description": "If `true`, only the Event payload is accessible to consuming Workflow states. If `false`, both event payload and context attributes should be accessible "
-        },
-        "metadata": {
-          "$ref": "#/definitions/metadata",
-          "description": "Metadata information"
-        }
-      },
-      "additionalProperties": false,
-      "if": {
-        "properties": {
-          "kind": {
-            "const": "consumed"
-          }
-        }
-      },
-      "then": {
-        "required": [
-          "name",
-          "source",
-          "type"
-        ]
-      },
-      "else": {
-        "required": [
-          "name",
-          "type"
-        ]
-      }
-    },
-    "correlationDef": {
-      "type": "object",
-      "description": "CloudEvent correlation definition",
-      "properties": {
-        "contextAttributeName": {
-          "type": "string",
-          "description": "CloudEvent Extension Context Attribute name",
-          "minLength": 1
-        },
-        "contextAttributeValue": {
-          "type": "string",
-          "description": "CloudEvent Extension Context Attribute value",
-          "minLength": 1
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "contextAttributeName"
-      ]
-    },
-    "function": {
-      "type": "object",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Unique function name",
-          "minLength": 1
-        },
-        "operation": {
-          "type": "string",
-          "description": "If type is `rest`, #. If type is `asyncapi`, #. If type is `rpc`, ##. If type is `graphql`, ##. If type is `odata`, #. If type is `expression`, defines the workflow expression.",
-          "minLength": 1
-        },
-        "type": {
-          "type": "string",
-          "description": "Defines the function type. Is either `rest`, `asyncapi, `rpc`, `graphql`, `odata`, or `expression`. Default is `rest`",
-          "enum": [
-            "rest",
-            "asyncapi",
-            "rpc",
-            "graphql",
-            "odata",
-            "expression"
-          ],
-          "default": "rest"
-        },
-        "authRef": {
-          "type": "string",
-          "description": "References an auth definition name to be used to access to resource defined in the operation parameter",
-          "minLength": 1
-        },
-        "metadata": {
-          "$ref": "#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "name",
-        "operation"
-      ]
-    },
-    "retrydef": {
-      "type": "object",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Unique retry strategy name",
-          "minLength": 1
-        },
-        "delay": {
-          "type": "string",
-          "description": "Time delay between retry attempts (ISO 8601 duration format)"
-        },
-        "maxDelay": {
-          "type": "string",
-          "description": "Maximum time delay between retry attempts (ISO 8601 duration format)"
-        },
-        "increment": {
-          "type": "string",
-          "description": "Static value by which the delay increases during each attempt (ISO 8601 time format)"
-        },
-        "multiplier": {
-          "type": [
-            "number",
-            "string"
-          ],
-          "minimum": 0,
-          "minLength": 1,
-          "multipleOf": 0.01,
-          "description": "Numeric value, if specified the delay between retries is multiplied by this value."
-        },
-        "maxAttempts": {
-          "type": [
-            "number",
-            "string"
-          ],
-          "minimum": 1,
-          "minLength": 0,
-          "description": "Maximum number of retry attempts."
-        },
-        "jitter": {
-          "type": [
-            "number",
-            "string"
-          ],
-          "minimum": 0,
-          "maximum": 1,
-          "description": "If float type, maximum amount of random time added or subtracted from the delay between each retry relative to total delay (between 0 and 1). If string type, absolute maximum amount of random time added or subtracted from the delay between each retry (ISO 8601 duration format)"
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "name",
-        "maxAttempts"
-      ]
-    },
-    "authdef": {
-      "type": "object",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Unique auth definition name",
-          "minLength": 1
-        },
-        "scheme": {
-          "type": "string",
-          "description": "Defines the auth type",
-          "enum": [
-            "basic",
-            "bearer",
-            "oauth2"
-          ],
-          "default": "basic"
-        },
-        "properties": {
-          "oneOf": [
-            {
-              "type": "string",
-              "description": "Expression referencing a workflow secret that contains all needed auth info"
-            },
-            {
-              "title": "Basic Auth Info",
-              "$ref": "#/definitions/basicpropsdef"
-            },
-            {
-              "title": "Bearer Auth Info State",
-              "$ref": "#/definitions/bearerpropsdef"
-            },
-            {
-              "title": "OAuth2  Info",
-              "$ref": "#/definitions/oauth2propsdef"
-            }
-          ]
-        }
-      },
-      "required": [
-        "name",
-        "properties"
-      ]
-    },
-    "basicpropsdef": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Expression referencing a workflow secret that contains all needed basic auth info"
-        },
-        {
-          "type": "object",
-          "description": "Basic auth information",
-          "properties": {
-            "username": {
-              "type": "string",
-              "description": "String or a workflow expression. Contains the user name",
-              "minLength": 1
-            },
-            "password": {
-              "type": "string",
-              "description": "String or a workflow expression. Contains the user password",
-              "minLength": 1
-            },
-            "metadata": {
-              "$ref": "#/definitions/metadata"
-            }
-          },
-          "required": [
-            "username",
-            "password"
-          ],
-          "additionalProperties": false
-        }
-      ]
-    },
-    "bearerpropsdef": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Expression referencing a workflow secret that contains all needed bearer auth info"
-        },
-        {
-          "type": "object",
-          "description": "Bearer auth information",
-          "properties": {
-            "token": {
-              "type": "string",
-              "description": "String or a workflow expression. Contains the token",
-              "minLength": 1
-            },
-            "metadata": {
-              "$ref": "#/definitions/metadata"
-            }
-          },
-          "required": [
-            "token"
-          ],
-          "additionalProperties": false
-        }
-      ]
-    },
-    "oauth2propsdef": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Expression referencing a workflow secret that contains all needed OAuth2 auth info"
-        },
-        {
-          "type": "object",
-          "description": "OAuth2 information",
-          "properties": {
-            "authority": {
-              "type": "string",
-              "description": "String or a workflow expression. Contains the authority information",
-              "minLength": 1
-            },
-            "grantType": {
-              "type": "string",
-              "description": "Defines the grant type",
-              "enum": [
-                "password",
-                "clientCredentials",
-                "tokenExchange"
-              ],
-              "additionalItems": false
-            },
-            "clientId": {
-              "type": "string",
-              "description": "String or a workflow expression. Contains the client identifier",
-              "minLength": 1
-            },
-            "clientSecret": {
-              "type": "string",
-              "description": "Workflow secret or a workflow expression. Contains the client secret",
-              "minLength": 1
-            },
-            "scopes": {
-              "type": "array",
-              "description": "Array containing strings or workflow expressions. Contains the OAuth2 scopes",
-              "items": {
-                "type": "string"
-              },
-              "minItems": 1,
-              "additionalItems": false
-            },
-            "username": {
-              "type": "string",
-              "description": "String or a workflow expression. Contains the user name. Used only if grantType is 'resourceOwner'",
-              "minLength": 1
-            },
-            "password": {
-              "type": "string",
-              "description": "String or a workflow expression. Contains the user password. Used only if grantType is 'resourceOwner'",
-              "minLength": 1
-            },
-            "audiences": {
-              "type": "array",
-              "description": "Array containing strings or workflow expressions. Contains the OAuth2 audiences",
-              "items": {
-                "type": "string"
-              },
-              "minItems": 1,
-              "additionalItems": false
-            },
-            "subjectToken": {
-              "type": "string",
-              "description": "String or a workflow expression. Contains the subject token",
-              "minLength": 1
-            },
-            "requestedSubject": {
-              "type": "string",
-              "description": "String or a workflow expression. Contains the requested subject",
-              "minLength": 1
-            },
-            "requestedIssuer": {
-              "type": "string",
-              "description": "String or a workflow expression. Contains the requested issuer",
-              "minLength": 1
-            },
-            "metadata": {
-              "$ref": "#/definitions/metadata"
-            }
-          },
-          "required": [
-            "grantType",
-            "clientId"
-          ]
-        }
-      ]
-    },
-    "metadata": {
-      "type": "object",
-      "description": "Metadata information",
-      "additionalProperties": {
-        "type": "string"
-      }
-    },
-    "secrets": {
-      "oneOf": [
-        {
-          "type": "string",
-          "format": "uri",
-          "description": "URI to a resource containing secrets definitions (json or yaml)"
-        },
-        {
-          "type": "array",
-          "description": "Workflow Secrets definitions",
-          "items": {
-            "type": "string"
-          },
-          "minItems": 1
-        }
-      ]
-    },
-    "timeouts": {
-      "oneOf": [
-        {
-          "type": "string",
-          "format": "uri",
-          "description": "URI to a resource containing timeouts definitions (json or yaml)"
-        },
-        {
-          "type": "object",
-          "description": "Workflow default timeouts",
-          "properties": {
-            "workflowExecTimeout": {
-              "$ref": "#/definitions/workflowExecTimeout"
-            },
-            "stateExecTimeout": {
-              "$ref": "#/definitions/stateExecTimeout"
-            },
-            "actionExecTimeout": {
-              "$ref": "#/definitions/actionExecTimeout"
-            },
-            "branchExecTimeout": {
-              "$ref": "#/definitions/branchExecTimeout"
-            },
-            "eventTimeout": {
-              "$ref": "#/definitions/eventTimeout"
-            }
-          },
-          "additionalProperties": false,
-          "required": []
-        }
-      ]
-    },
-    "errors": {
-      "oneOf": [
-        {
-          "type": "string",
-          "format": "uri",
-          "description": "URI to a resource containing error definitions (json or yaml)"
-        },
-        {
-          "type": "array",
-          "description": "Workflow Error definitions. Defines checked errors that can be explicitly handled during workflow execution",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/errordef"
-          },
-          "additionalItems": false,
-          "minItems": 1
-        }
-      ]
-    },
-    "events": {
-      "oneOf": [
-        {
-          "type": "string",
-          "format": "uri",
-          "description": "URI to a resource containing event definitions (json or yaml)"
-        },
-        {
-          "type": "array",
-          "description": "Workflow CloudEvent definitions. Defines CloudEvents that can be consumed or produced",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/eventdef"
-          },
-          "additionalItems": false,
-          "minItems": 1
-        }
-      ]
-    },
-    "functions": {
-      "oneOf": [
-        {
-          "type": "string",
-          "format": "uri",
-          "description": "URI to a resource containing function definitions (json or yaml)"
-        },
-        {
-          "type": "array",
-          "description": "Workflow function definitions",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/function"
-          },
-          "additionalItems": false,
-          "minItems": 1
-        }
-      ]
-    },
-    "retries": {
-      "oneOf": [
-        {
-          "type": "string",
-          "format": "uri",
-          "description": "URI to a resource containing retry definitions (json or yaml)"
-        },
-        {
-          "type": "array",
-          "description": "Workflow Retry definitions. Define retry strategies that can be referenced in states onError definitions",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/retrydef"
-          },
-          "additionalItems": false,
-          "minItems": 1
-        }
-      ]
-    },
-    "auth": {
-      "oneOf": [
-        {
-          "type": "string",
-          "format": "uri",
-          "description": "URI to a resource containing auth definitions (json or yaml)"
-        },
-        {
-          "type": "array",
-          "description": "Workflow auth definitions",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/authdef"
-          },
-          "additionalItems": false,
-          "minItems": 1
-        }
-      ]
-    }
-  }
-}
\ No newline at end of file
diff --git a/src/lib/schema/auth.json b/src/lib/schema/auth.json
deleted file mode 100644
index 770b3daa..00000000
--- a/src/lib/schema/auth.json
+++ /dev/null
@@ -1,221 +0,0 @@
-{
-  "$id": "https://serverlessworkflow.io/schemas/0.7/auth.json",
-  "$schema": "http://json-schema.org/draft-07/schema#",
-  "description": "Serverless Workflow specification - auth schema",
-  "type": "object",
-  "auth": {
-    "oneOf": [
-      {
-        "type": "string",
-        "format": "uri",
-        "description": "URI to a resource containing auth definitions (json or yaml)"
-      },
-      {
-        "type": "array",
-        "description": "Workflow auth definitions",
-        "items": {
-          "type": "object",
-          "$ref": "#/definitions/authdef"
-        },
-        "additionalItems": false,
-        "minItems": 1
-      }
-    ]
-  },
-  "required": [
-    "auth"
-  ],
-  "definitions": {
-    "authdef": {
-      "type": "object",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Unique auth definition name",
-          "minLength": 1
-        },
-        "scheme": {
-          "type": "string",
-          "description": "Defines the auth type",
-          "enum": [
-            "basic",
-            "bearer",
-            "oauth2"
-          ],
-          "default": "basic"
-        },
-        "properties": {
-          "oneOf": [
-            {
-              "type": "string",
-              "description": "Expression referencing a workflow secret that contains all needed auth info"
-            },
-            {
-              "title": "Basic Auth Info",
-              "$ref": "#/definitions/basicpropsdef"
-            },
-            {
-              "title": "Bearer Auth Info State",
-              "$ref": "#/definitions/bearerpropsdef"
-            },
-            {
-              "title": "OAuth2  Info",
-              "$ref": "#/definitions/oauth2propsdef"
-            }
-          ]
-        }
-      },
-      "required": [
-        "name",
-        "properties"
-      ]
-    },
-    "basicpropsdef": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Expression referencing a workflow secret that contains all needed basic auth info"
-        },
-        {
-          "type": "object",
-          "description": "Basic auth information",
-          "properties": {
-            "username": {
-              "type": "string",
-              "description": "String or a workflow expression. Contains the user name",
-              "minLength": 1
-            },
-            "password": {
-              "type": "string",
-              "description": "String or a workflow expression. Contains the user password",
-              "minLength": 1
-            },
-            "metadata": {
-              "$ref": "common.json#/definitions/metadata"
-            }
-          },
-          "required": [
-            "username",
-            "password"
-          ],
-          "additionalProperties": false
-        }
-      ]
-    },
-    "bearerpropsdef": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Expression referencing a workflow secret that contains all needed bearer auth info"
-        },
-        {
-          "type": "object",
-          "description": "Bearer auth information",
-          "properties": {
-            "token": {
-              "type": "string",
-              "description": "String or a workflow expression. Contains the token",
-              "minLength": 1
-            },
-            "metadata": {
-              "$ref": "common.json#/definitions/metadata"
-            }
-          },
-          "required": [
-            "token"
-          ],
-          "additionalProperties": false
-        }
-      ]
-    },
-    "oauth2propsdef": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Expression referencing a workflow secret that contains all needed OAuth2 auth info"
-        },
-        {
-          "type": "object",
-          "description": "OAuth2 information",
-          "properties": {
-            "authority": {
-              "type": "string",
-              "description": "String or a workflow expression. Contains the authority information",
-              "minLength": 1
-            },
-            "grantType": {
-              "type": "string",
-              "description": "Defines the grant type",
-              "enum": [
-                "password",
-                "clientCredentials",
-                "tokenExchange"
-              ],
-              "additionalItems": false
-            },
-            "clientId": {
-              "type": "string",
-              "description": "String or a workflow expression. Contains the client identifier",
-              "minLength": 1
-            },
-            "clientSecret": {
-              "type": "string",
-              "description": "Workflow secret or a workflow expression. Contains the client secret",
-              "minLength": 1
-            },
-            "scopes": {
-              "type": "array",
-              "description": "Array containing strings or workflow expressions. Contains the OAuth2 scopes",
-              "items": {
-                "type": "string"
-              },
-              "minItems": 1,
-              "additionalItems": false
-            },
-            "username": {
-              "type": "string",
-              "description": "String or a workflow expression. Contains the user name. Used only if grantType is 'resourceOwner'",
-              "minLength": 1
-            },
-            "password": {
-              "type": "string",
-              "description": "String or a workflow expression. Contains the user password. Used only if grantType is 'resourceOwner'",
-              "minLength": 1
-            },
-            "audiences": {
-              "type": "array",
-              "description": "Array containing strings or workflow expressions. Contains the OAuth2 audiences",
-              "items": {
-                "type": "string"
-              },
-              "minItems": 1,
-              "additionalItems": false
-            },
-            "subjectToken": {
-              "type": "string",
-              "description": "String or a workflow expression. Contains the subject token",
-              "minLength": 1
-            },
-            "requestedSubject": {
-              "type": "string",
-              "description": "String or a workflow expression. Contains the requested subject",
-              "minLength": 1
-            },
-            "requestedIssuer": {
-              "type": "string",
-              "description": "String or a workflow expression. Contains the requested issuer",
-              "minLength": 1
-            },
-            "metadata": {
-              "$ref": "common.json#/definitions/metadata"
-            }
-          },
-          "required": [
-            "grantType",
-            "clientId"
-          ]
-        }
-      ]
-    }
-  }
-}
\ No newline at end of file
diff --git a/src/lib/schema/common.json b/src/lib/schema/common.json
deleted file mode 100644
index 60224c55..00000000
--- a/src/lib/schema/common.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "$id": "https://serverlessworkflow.io/schemas/0.7/common.json",
-  "$schema": "http://json-schema.org/draft-07/schema#",
-  "description": "Serverless Workflow specification - common schema",
-  "type": "object",
-  "definitions": {
-    "metadata": {
-      "type": "object",
-      "description": "Metadata information",
-      "additionalProperties": {
-        "type": "string"
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/src/lib/schema/errors.json b/src/lib/schema/errors.json
deleted file mode 100644
index b455efff..00000000
--- a/src/lib/schema/errors.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
-  "$id": "https://serverlessworkflow.io/schemas/0.7/errors.json",
-  "$schema": "http://json-schema.org/draft-07/schema#",
-  "description": "Serverless Workflow specification - errors schema",
-  "type": "object",
-  "errors": {
-    "oneOf": [
-      {
-        "type": "string",
-        "format": "uri",
-        "description": "URI to a resource containing error definitions (json or yaml)"
-      },
-      {
-        "type": "array",
-        "description": "Workflow Error definitions. Defines checked errors that can be explicitly handled during workflow execution",
-        "items": {
-          "type": "object",
-          "$ref": "#/definitions/errordef"
-        },
-        "additionalItems": false,
-        "minItems": 1
-      }
-    ]
-  },
-  "required": [
-    "errors"
-  ],
-  "definitions": {
-    "errordef": {
-      "type": "object",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Domain-specific error name",
-          "minLength": 1
-        },
-        "code": {
-          "type": "string",
-          "description": "Error code. Can be used in addition to the name to help runtimes resolve to technical errors/exceptions. Should not be defined if error is set to '*'",
-          "minLength": 1
-        },
-        "description": {
-          "type": "string",
-          "description": "Error description"
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "name"
-      ]
-    }
-  }
-}
\ No newline at end of file
diff --git a/src/lib/schema/events.json b/src/lib/schema/events.json
deleted file mode 100644
index c5c72aee..00000000
--- a/src/lib/schema/events.json
+++ /dev/null
@@ -1,117 +0,0 @@
-{
-  "$id": "https://serverlessworkflow.io/schemas/0.7/events.json",
-  "$schema": "http://json-schema.org/draft-07/schema#",
-  "description": "Serverless Workflow specification - events schema",
-  "type": "object",
-  "events": {
-    "oneOf": [
-      {
-        "type": "string",
-        "format": "uri",
-        "description": "URI to a resource containing event definitions (json or yaml)"
-      },
-      {
-        "type": "array",
-        "description": "Workflow CloudEvent definitions. Defines CloudEvents that can be consumed or produced",
-        "items": {
-          "type": "object",
-          "$ref": "#/definitions/eventdef"
-        },
-        "additionalItems": false,
-        "minItems": 1
-      }
-    ]
-  },
-  "required": [
-    "events"
-  ],
-  "definitions": {
-    "eventdef": {
-      "type": "object",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Unique event name",
-          "minLength": 1
-        },
-        "source": {
-          "type": "string",
-          "description": "CloudEvent source"
-        },
-        "type": {
-          "type": "string",
-          "description": "CloudEvent type"
-        },
-        "kind": {
-          "type": "string",
-          "enum": [
-            "consumed",
-            "produced"
-          ],
-          "description": "Defines the CloudEvent as either 'consumed' or 'produced' by the workflow. Default is 'consumed'",
-          "default": "consumed"
-        },
-        "correlation": {
-          "type": "array",
-          "description": "CloudEvent correlation definitions",
-          "minItems": 1,
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/correlationDef"
-          },
-          "additionalItems": false
-        },
-        "dataOnly": {
-          "type": "boolean",
-          "default": true,
-          "description": "If `true`, only the Event payload is accessible to consuming Workflow states. If `false`, both event payload and context attributes should be accessible "
-        },
-        "metadata": {
-          "$ref": "common.json#/definitions/metadata",
-          "description": "Metadata information"
-        }
-      },
-      "additionalProperties": false,
-      "if": {
-        "properties": {
-          "kind": {
-            "const": "consumed"
-          }
-        }
-      },
-      "then": {
-        "required": [
-          "name",
-          "source",
-          "type"
-        ]
-      },
-      "else": {
-        "required": [
-          "name",
-          "type"
-        ]
-      }
-    },
-    "correlationDef": {
-      "type": "object",
-      "description": "CloudEvent correlation definition",
-      "properties": {
-        "contextAttributeName": {
-          "type": "string",
-          "description": "CloudEvent Extension Context Attribute name",
-          "minLength": 1
-        },
-        "contextAttributeValue": {
-          "type": "string",
-          "description": "CloudEvent Extension Context Attribute value",
-          "minLength": 1
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "contextAttributeName"
-      ]
-    }
-  }
-}
\ No newline at end of file
diff --git a/src/lib/schema/functions.json b/src/lib/schema/functions.json
deleted file mode 100644
index cb35222a..00000000
--- a/src/lib/schema/functions.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
-  "$id": "https://serverlessworkflow.io/schemas/0.7/functions.json",
-  "$schema": "http://json-schema.org/draft-07/schema#",
-  "description": "Serverless Workflow specification - functions schema",
-  "type": "object",
-  "functions": {
-    "oneOf": [
-      {
-        "type": "string",
-        "format": "uri",
-        "description": "URI to a resource containing function definitions (json or yaml)"
-      },
-      {
-        "type": "array",
-        "description": "Workflow function definitions",
-        "items": {
-          "type": "object",
-          "$ref": "#/definitions/function"
-        },
-        "additionalItems": false,
-        "minItems": 1
-      }
-    ]
-  },
-  "required": [
-    "functions"
-  ],
-  "definitions": {
-    "function": {
-      "type": "object",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Unique function name",
-          "minLength": 1
-        },
-        "operation": {
-          "type": "string",
-          "description": "If type is `rest`, #. If type is `asyncapi`, #. If type is `rpc`, ##. If type is `graphql`, ##. If type is `odata`, #. If type is `expression`, defines the workflow expression.",
-          "minLength": 1
-        },
-        "type": {
-          "type": "string",
-          "description": "Defines the function type. Is either `rest`, `asyncapi, `rpc`, `graphql`, `odata`, or `expression`. Default is `rest`",
-          "enum": [
-            "rest",
-            "asyncapi",
-            "rpc",
-            "graphql",
-            "odata",
-            "expression"
-          ],
-          "default": "rest"
-        },
-        "authRef": {
-          "type": "string",
-          "description": "References an auth definition name to be used to access to resource defined in the operation parameter",
-          "minLength": 1
-        },
-        "metadata": {
-          "$ref": "common.json#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "name",
-        "operation"
-      ]
-    }
-  }
-}
\ No newline at end of file
diff --git a/src/lib/schema/retries.json b/src/lib/schema/retries.json
deleted file mode 100644
index 23df5e3e..00000000
--- a/src/lib/schema/retries.json
+++ /dev/null
@@ -1,85 +0,0 @@
-{
-  "$id": "https://serverlessworkflow.io/schemas/0.7/retries.json",
-  "$schema": "http://json-schema.org/draft-07/schema#",
-  "description": "Serverless Workflow specification - retries schema",
-  "type": "object",
-  "retries": {
-    "oneOf": [
-      {
-        "type": "string",
-        "format": "uri",
-        "description": "URI to a resource containing retry definitions (json or yaml)"
-      },
-      {
-        "type": "array",
-        "description": "Workflow Retry definitions. Define retry strategies that can be referenced in states onError definitions",
-        "items": {
-          "type": "object",
-          "$ref": "#/definitions/retrydef"
-        },
-        "additionalItems": false,
-        "minItems": 1
-      }
-    ]
-  },
-  "required": [
-    "retries"
-  ],
-  "definitions": {
-    "retrydef": {
-      "type": "object",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Unique retry strategy name",
-          "minLength": 1
-        },
-        "delay": {
-          "type": "string",
-          "description": "Time delay between retry attempts (ISO 8601 duration format)"
-        },
-        "maxDelay": {
-          "type": "string",
-          "description": "Maximum time delay between retry attempts (ISO 8601 duration format)"
-        },
-        "increment": {
-          "type": "string",
-          "description": "Static value by which the delay increases during each attempt (ISO 8601 time format)"
-        },
-        "multiplier": {
-          "type": [
-            "number",
-            "string"
-          ],
-          "minimum": 0,
-          "minLength": 1,
-          "multipleOf": 0.01,
-          "description": "Numeric value, if specified the delay between retries is multiplied by this value."
-        },
-        "maxAttempts": {
-          "type": [
-            "number",
-            "string"
-          ],
-          "minimum": 1,
-          "minLength": 0,
-          "description": "Maximum number of retry attempts."
-        },
-        "jitter": {
-          "type": [
-            "number",
-            "string"
-          ],
-          "minimum": 0,
-          "maximum": 1,
-          "description": "If float type, maximum amount of random time added or subtracted from the delay between each retry relative to total delay (between 0 and 1). If string type, absolute maximum amount of random time added or subtracted from the delay between each retry (ISO 8601 duration format)"
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "name",
-        "maxAttempts"
-      ]
-    }
-  }
-}
\ No newline at end of file
diff --git a/src/lib/schema/secrets.json b/src/lib/schema/secrets.json
deleted file mode 100644
index 427d68ed..00000000
--- a/src/lib/schema/secrets.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-  "$id": "https://serverlessworkflow.io/schemas/0.7/secrets.json",
-  "$schema": "http://json-schema.org/draft-07/schema#",
-  "description": "Serverless Workflow specification - secrets schema",
-  "type": "object",
-  "secrets": {
-    "oneOf": [
-      {
-        "type": "string",
-        "format": "uri",
-        "description": "URI to a resource containing secrets definitions (json or yaml)"
-      },
-      {
-        "type": "array",
-        "description": "Workflow Secrets definitions",
-        "items": {
-          "type": "string"
-        },
-        "minItems": 1
-      }
-    ]
-  },
-  "required": [
-    "secrets"
-  ]
-}
\ No newline at end of file
diff --git a/src/lib/schema/timeouts.json b/src/lib/schema/timeouts.json
deleted file mode 100644
index 5e6ec52c..00000000
--- a/src/lib/schema/timeouts.json
+++ /dev/null
@@ -1,120 +0,0 @@
-{
-  "$id": "https://serverlessworkflow.io/schemas/0.7/timeouts.json",
-  "$schema": "http://json-schema.org/draft-07/schema#",
-  "description": "Serverless Workflow specification - functions schema",
-  "type": "object",
-  "timeouts": {
-    "oneOf": [
-      {
-        "type": "string",
-        "format": "uri",
-        "description": "URI to a resource containing timeouts definitions (json or yaml)"
-      },
-      {
-        "type": "object",
-        "description": "Workflow default timeouts",
-        "properties": {
-          "workflowExecTimeout": {
-            "$ref": "#/definitions/workflowExecTimeout"
-          },
-          "stateExecTimeout": {
-            "$ref": "#/definitions/stateExecTimeout"
-          },
-          "actionExecTimeout": {
-            "$ref": "#/definitions/actionExecTimeout"
-          },
-          "branchExecTimeout": {
-            "$ref": "#/definitions/branchExecTimeout"
-          },
-          "eventTimeout": {
-            "$ref": "#/definitions/eventTimeout"
-          }
-        },
-        "additionalProperties": false,
-        "required": []
-      }
-    ]
-  },
-  "required": [
-    "timeouts"
-  ],
-  "definitions": {
-    "workflowExecTimeout": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Workflow execution timeout duration (ISO 8601 duration format). If not specified should be 'unlimited'",
-          "minLength": 1
-        },
-        {
-          "type": "object",
-          "properties": {
-            "duration": {
-              "type": "string",
-              "description": "Workflow execution timeout duration (ISO 8601 duration format). If not specified should be 'unlimited'",
-              "minLength": 1
-            },
-            "interrupt": {
-              "type": "boolean",
-              "description": "If `false`, workflow instance is allowed to finish current execution. If `true`, current workflow execution is abrupted.",
-              "default": true
-            },
-            "runBefore": {
-              "type": "string",
-              "description": "Name of a workflow state to be executed before workflow instance is terminated",
-              "minLength": 1
-            }
-          },
-          "additionalProperties": false,
-          "required": [
-            "duration"
-          ]
-        }
-      ]
-    },
-    "stateExecTimeout": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Total state execution timeout (including retries) (ISO 8601 duration format)",
-          "minLength": 1
-        },
-        {
-          "type": "object",
-          "description": "Workflow default timeouts",
-          "properties": {
-            "single": {
-              "type": "string",
-              "description": "Single state execution timeout, not including retries (ISO 8601 duration format)",
-              "minLength": 1
-            },
-            "total": {
-              "type": "string",
-              "description": "Total state execution timeout, including retries (ISO 8601 duration format)",
-              "minLength": 1
-            }
-          },
-          "additionalProperties": false,
-          "required": [
-            "total"
-          ]
-        }
-      ]
-    },
-    "actionExecTimeout": {
-      "type": "string",
-      "description": "Single actions definition execution timeout duration (ISO 8601 duration format)",
-      "minLength": 1
-    },
-    "branchExecTimeout": {
-      "type": "string",
-      "description": "Single branch execution timeout duration (ISO 8601 duration format)",
-      "minLength": 1
-    },
-    "eventTimeout": {
-      "type": "string",
-      "description": "Timeout duration to wait for consuming defined events (ISO 8601 duration format)",
-      "minLength": 1
-    }
-  }
-}
\ No newline at end of file
diff --git a/src/lib/schema/types/workflow.ts b/src/lib/schema/types/workflow.ts
deleted file mode 100644
index 4db2fe2c..00000000
--- a/src/lib/schema/types/workflow.ts
+++ /dev/null
@@ -1,1509 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Serverless Workflow specification - workflow schema
- */
-export type Workflow /* Serverless Workflow specification - workflow schema */ =
-  | {
-      /**
-       * Workflow unique identifier
-       */
-      id: string;
-      /**
-       * Domain-specific workflow identifier
-       */
-      key?: string;
-      /**
-       * Workflow name
-       */
-      name: string;
-      /**
-       * Workflow description
-       */
-      description?: string;
-      /**
-       * Workflow version
-       */
-      version?: string;
-      /**
-       * List of helpful terms describing the workflows intended purpose, subject areas, or other important qualities
-       */
-      annotations?: [string, ...string[]];
-      dataInputSchema?:
-        | string
-        | {
-            /**
-             * URI of the JSON Schema used to validate the workflow data input
-             */
-            schema: string;
-            /**
-             * Determines if workflow execution should continue if there are validation errors
-             */
-            failOnValidationErrors: boolean;
-          };
-      secrets?: Secrets;
-      constants?:
-        | string /* uri */
-        | {
-            [key: string]: any;
-          };
-      start: Startdef;
-      /**
-       * Serverless Workflow schema version
-       */
-      specVersion: string;
-      /**
-       * Identifies the expression language used for workflow expressions. Default is 'jq'
-       */
-      expressionLang?: string;
-      timeouts?: Timeouts;
-      errors?: Errors;
-      /**
-       * If 'true', workflow instances is not terminated when there are no active execution paths. Instance can be terminated via 'terminate end definition' or reaching defined 'workflowExecTimeout'
-       */
-      keepActive?: boolean;
-      metadata?: /* Metadata information */ Metadata;
-      events?: Events;
-      functions?: Functions;
-      /**
-       * If set to true, actions should automatically be retried on unchecked errors. Default is false
-       */
-      autoRetries?: boolean;
-      retries?: Retries;
-      auth?: Auth;
-      /**
-       * State definitions
-       */
-      states: [
-        (
-          | /* Causes the workflow execution to sleep for a specified duration */ Sleepstate
-          | /* This state is used to wait for events from event sources, then consumes them and invoke one or more actions to run in sequence or parallel */ Eventstate
-          | /* Defines actions be performed. Does not wait for incoming events */ Operationstate
-          | /* Consists of a number of states that are executed in parallel */ Parallelstate
-          | Switchstate
-          | /* Inject static data into state data. Does not perform any actions */ Injectstate
-          | /* Execute a set of defined actions or workflows for each element of a data array */ Foreachstate
-          | /* This state performs an action, then waits for the callback event that denotes completion of the action */ Callbackstate
-        ),
-        ...(
-          | /* Causes the workflow execution to sleep for a specified duration */ Sleepstate
-          | /* This state is used to wait for events from event sources, then consumes them and invoke one or more actions to run in sequence or parallel */ Eventstate
-          | /* Defines actions be performed. Does not wait for incoming events */ Operationstate
-          | /* Consists of a number of states that are executed in parallel */ Parallelstate
-          | Switchstate
-          | /* Inject static data into state data. Does not perform any actions */ Injectstate
-          | /* Execute a set of defined actions or workflows for each element of a data array */ Foreachstate
-          | /* This state performs an action, then waits for the callback event that denotes completion of the action */ Callbackstate
-        )[]
-      ];
-    }
-  | {
-      /**
-       * Workflow unique identifier
-       */
-      id?: string;
-      /**
-       * Domain-specific workflow identifier
-       */
-      key: string;
-      /**
-       * Workflow name
-       */
-      name: string;
-      /**
-       * Workflow description
-       */
-      description?: string;
-      /**
-       * Workflow version
-       */
-      version?: string;
-      /**
-       * List of helpful terms describing the workflows intended purpose, subject areas, or other important qualities
-       */
-      annotations?: [string, ...string[]];
-      dataInputSchema?:
-        | string
-        | {
-            /**
-             * URI of the JSON Schema used to validate the workflow data input
-             */
-            schema: string;
-            /**
-             * Determines if workflow execution should continue if there are validation errors
-             */
-            failOnValidationErrors: boolean;
-          };
-      secrets?: Secrets;
-      constants?:
-        | string /* uri */
-        | {
-            [key: string]: any;
-          };
-      start: Startdef;
-      /**
-       * Serverless Workflow schema version
-       */
-      specVersion: string;
-      /**
-       * Identifies the expression language used for workflow expressions. Default is 'jq'
-       */
-      expressionLang?: string;
-      timeouts?: Timeouts;
-      errors?: Errors;
-      /**
-       * If 'true', workflow instances is not terminated when there are no active execution paths. Instance can be terminated via 'terminate end definition' or reaching defined 'workflowExecTimeout'
-       */
-      keepActive?: boolean;
-      metadata?: /* Metadata information */ Metadata;
-      events?: Events;
-      functions?: Functions;
-      /**
-       * If set to true, actions should automatically be retried on unchecked errors. Default is false
-       */
-      autoRetries?: boolean;
-      retries?: Retries;
-      auth?: Auth;
-      /**
-       * State definitions
-       */
-      states: [
-        (
-          | /* Causes the workflow execution to sleep for a specified duration */ Sleepstate
-          | /* This state is used to wait for events from event sources, then consumes them and invoke one or more actions to run in sequence or parallel */ Eventstate
-          | /* Defines actions be performed. Does not wait for incoming events */ Operationstate
-          | /* Consists of a number of states that are executed in parallel */ Parallelstate
-          | Switchstate
-          | /* Inject static data into state data. Does not perform any actions */ Injectstate
-          | /* Execute a set of defined actions or workflows for each element of a data array */ Foreachstate
-          | /* This state performs an action, then waits for the callback event that denotes completion of the action */ Callbackstate
-        ),
-        ...(
-          | /* Causes the workflow execution to sleep for a specified duration */ Sleepstate
-          | /* This state is used to wait for events from event sources, then consumes them and invoke one or more actions to run in sequence or parallel */ Eventstate
-          | /* Defines actions be performed. Does not wait for incoming events */ Operationstate
-          | /* Consists of a number of states that are executed in parallel */ Parallelstate
-          | Switchstate
-          | /* Inject static data into state data. Does not perform any actions */ Injectstate
-          | /* Execute a set of defined actions or workflows for each element of a data array */ Foreachstate
-          | /* This state performs an action, then waits for the callback event that denotes completion of the action */ Callbackstate
-        )[]
-      ];
-    };
-export type Action =
-  | {
-      /**
-       * Unique action definition name
-       */
-      name?: string;
-      functionRef: Functionref;
-      eventRef?: /* Event References */ Eventref;
-      subFlowRef?: Subflowref;
-      sleep?: Sleep;
-      /**
-       * References a defined workflow retry definition. If not defined the default retry policy is assumed
-       */
-      retryRef?: string;
-      /**
-       * List of unique references to defined workflow errors for which the action should not be retried. Used only when `autoRetries` is set to `true`
-       */
-      nonRetryableErrors?: [string, ...string[]];
-      /**
-       * List of unique references to defined workflow errors for which the action should be retried. Used only when `autoRetries` is set to `false`
-       */
-      retryableErrors?: [string, ...string[]];
-      actionDataFilter?: Actiondatafilter;
-    }
-  | {
-      /**
-       * Unique action definition name
-       */
-      name?: string;
-      functionRef?: Functionref;
-      eventRef: /* Event References */ Eventref;
-      subFlowRef?: Subflowref;
-      sleep?: Sleep;
-      /**
-       * References a defined workflow retry definition. If not defined the default retry policy is assumed
-       */
-      retryRef?: string;
-      /**
-       * List of unique references to defined workflow errors for which the action should not be retried. Used only when `autoRetries` is set to `true`
-       */
-      nonRetryableErrors?: [string, ...string[]];
-      /**
-       * List of unique references to defined workflow errors for which the action should be retried. Used only when `autoRetries` is set to `false`
-       */
-      retryableErrors?: [string, ...string[]];
-      actionDataFilter?: Actiondatafilter;
-    }
-  | {
-      /**
-       * Unique action definition name
-       */
-      name?: string;
-      functionRef?: Functionref;
-      eventRef?: /* Event References */ Eventref;
-      subFlowRef: Subflowref;
-      sleep?: Sleep;
-      /**
-       * References a defined workflow retry definition. If not defined the default retry policy is assumed
-       */
-      retryRef?: string;
-      /**
-       * List of unique references to defined workflow errors for which the action should not be retried. Used only when `autoRetries` is set to `true`
-       */
-      nonRetryableErrors?: [string, ...string[]];
-      /**
-       * List of unique references to defined workflow errors for which the action should be retried. Used only when `autoRetries` is set to `false`
-       */
-      retryableErrors?: [string, ...string[]];
-      actionDataFilter?: Actiondatafilter;
-    };
-/**
- * Single actions definition execution timeout duration (ISO 8601 duration format)
- */
-export type ActionExecTimeout = string;
-export interface Actiondatafilter {
-  /**
-   * Workflow expression that selects state data that the state action can use
-   */
-  fromStateData?: string;
-  /**
-   * Workflow expression that filters the actions data results
-   */
-  results?: string;
-  /**
-   * Workflow expression that selects a state data element to which the action results should be added/merged into. If not specified, denote, the top-level state data element
-   */
-  toStateData?: string;
-}
-export type Auth = string /* uri */ | [Authdef, ...Authdef[]];
-export interface Authdef {
-  /**
-   * Unique auth definition name
-   */
-  name: string;
-  /**
-   * Defines the auth type
-   */
-  scheme?: 'basic' | 'bearer' | 'oauth2';
-  properties: string | Basicpropsdef | Bearerpropsdef | Oauth2propsdef;
-}
-export type Basicpropsdef =
-  | string
-  | {
-      /**
-       * String or a workflow expression. Contains the user name
-       */
-      username: string;
-      /**
-       * String or a workflow expression. Contains the user password
-       */
-      password: string;
-      metadata?: /* Metadata information */ Metadata;
-    };
-export type Bearerpropsdef =
-  | string
-  | {
-      /**
-       * String or a workflow expression. Contains the token
-       */
-      token: string;
-      metadata?: /* Metadata information */ Metadata;
-    };
-/**
- * Branch Definition
- */
-export interface Branch {
-  /**
-   * Branch name
-   */
-  name: string;
-  /**
-   * State specific timeouts
-   */
-  timeouts?: {
-    actionExecTimeout?: /* Single actions definition execution timeout duration (ISO 8601 duration format) */ ActionExecTimeout;
-    branchExecTimeout?: /* Single branch execution timeout duration (ISO 8601 duration format) */ BranchExecTimeout;
-  };
-  /**
-   * Actions to be executed in this branch
-   */
-  actions: Action[];
-}
-/**
- * Single branch execution timeout duration (ISO 8601 duration format)
- */
-export type BranchExecTimeout = string;
-/**
- * This state performs an action, then waits for the callback event that denotes completion of the action
- */
-export interface Callbackstate {
-  /**
-   * Unique state id
-   */
-  id?: string;
-  /**
-   * State name
-   */
-  name?: string;
-  /**
-   * State type
-   */
-  type?: 'callback';
-  /**
-   * Defines the action to be executed
-   */
-  action?: Action;
-  /**
-   * References an unique callback event name in the defined workflow events
-   */
-  eventRef?: string;
-  /**
-   * State specific timeouts
-   */
-  timeouts?: {
-    stateExecTimeout?: StateExecTimeout;
-    actionExecTimeout?: /* Single actions definition execution timeout duration (ISO 8601 duration format) */ ActionExecTimeout;
-    eventTimeout?: /* Timeout duration to wait for consuming defined events (ISO 8601 duration format) */ EventTimeout;
-  };
-  /**
-   * Event data filter
-   */
-  eventDataFilter?: Eventdatafilter;
-  /**
-   * State data filter
-   */
-  stateDataFilter?: Statedatafilter;
-  /**
-   * States error handling definitions
-   */
-  onErrors?: Error[];
-  /**
-   * Next transition of the workflow after all the actions have been performed
-   */
-  transition?: Transition;
-  /**
-   * State end definition
-   */
-  end?: End;
-  /**
-   * Unique Name of a workflow state which is responsible for compensation of this state
-   */
-  compensatedBy?: string;
-  /**
-   * If true, this state is used to compensate another state. Default is false
-   */
-  usedForCompensation?: boolean;
-  metadata?: /* Metadata information */ Metadata;
-}
-export type Continueasdef =
-  | string
-  | {
-      /**
-       * Unique id of the workflow to continue execution as
-       */
-      workflowId: string;
-      /**
-       * Version of the workflow to continue execution as
-       */
-      version?: string;
-      /**
-       * If string type, an expression which selects parts of the states data output to become the workflow data input of continued execution. If object type, a custom object to become the workflow data input of the continued execution
-       */
-      data?:
-        | string
-        | {
-            [key: string]: any;
-          };
-      /**
-       * Workflow execution timeout to be used by the workflow continuing execution. Overwrites any specific settings set by that workflow
-       */
-      workflowExecTimeout?: WorkflowExecTimeout;
-    };
-/**
- * CloudEvent correlation definition
- */
-export interface CorrelationDef {
-  /**
-   * CloudEvent Extension Context Attribute name
-   */
-  contextAttributeName: string;
-  /**
-   * CloudEvent Extension Context Attribute value
-   */
-  contextAttributeValue?: string;
-}
-export type Crondef =
-  | string
-  | {
-      /**
-       * Repeating interval (cron expression) describing when the workflow instance should be created
-       */
-      expression: string;
-      /**
-       * Specific date and time (ISO 8601 format) when the cron expression invocation is no longer valid
-       */
-      validUntil?: string;
-    };
-/**
- * Permits transitions to other states based on data conditions
- */
-export interface Databasedswitch {
-  /**
-   * Unique State id
-   */
-  id?: string;
-  /**
-   * State name
-   */
-  name: string;
-  /**
-   * State type
-   */
-  type: 'switch';
-  /**
-   * State data filter
-   */
-  stateDataFilter?: Statedatafilter;
-  /**
-   * State specific timeouts
-   */
-  timeouts?: {
-    stateExecTimeout?: StateExecTimeout;
-  };
-  /**
-   * Defines conditions evaluated against state data
-   */
-  dataConditions: Datacondition[];
-  /**
-   * States error handling definitions
-   */
-  onErrors?: Error[];
-  /**
-   * Default transition of the workflow if there is no matching data conditions. Can include a transition or end definition
-   */
-  defaultCondition?: /* DefaultCondition definition. Can be either a transition or end definition */ Defaultconditiondef;
-  /**
-   * Unique Name of a workflow state which is responsible for compensation of this state
-   */
-  compensatedBy?: string;
-  /**
-   * If true, this state is used to compensate another state. Default is false
-   */
-  usedForCompensation?: boolean;
-  metadata?: /* Metadata information */ Metadata;
-}
-export type Datacondition /* Switch state data based condition */ =
-  | Transitiondatacondition
-  | /* Switch state data based condition */ Enddatacondition;
-/**
- * DefaultCondition definition. Can be either a transition or end definition
- */
-export type Defaultconditiondef /* DefaultCondition definition. Can be either a transition or end definition */ =
-  | {
-      transition: Transition;
-      end?: End;
-    }
-  | {
-      transition?: Transition;
-      end: End;
-    };
-export type End =
-  | boolean
-  | {
-      /**
-       * If true, completes all execution flows in the given workflow instance
-       */
-      terminate?: boolean;
-      /**
-       * Defines events that should be produced
-       */
-      produceEvents?: /* Produce an event and set its data */ Produceeventdef[];
-      /**
-       * If set to true, triggers workflow compensation. Default is false
-       */
-      compensate?: boolean;
-      continueAs?: Continueasdef;
-    };
-/**
- * Switch state data based condition
- */
-export interface Enddatacondition {
-  /**
-   * Data condition name
-   */
-  name?: string;
-  /**
-   * Workflow expression evaluated against state data. Must evaluate to true or false
-   */
-  condition: string;
-  /**
-   * Workflow end definition
-   */
-  end: End;
-  metadata?: /* Metadata information */ Metadata;
-}
-/**
- * Switch state data event condition
- */
-export interface Enddeventcondition {
-  /**
-   * Event condition name
-   */
-  name?: string;
-  /**
-   * References an unique event name in the defined workflow events
-   */
-  eventRef: string;
-  /**
-   * Explicit transition to end
-   */
-  end: End;
-  /**
-   * Event data filter definition
-   */
-  eventDataFilter?: Eventdatafilter;
-  metadata?: /* Metadata information */ Metadata;
-}
-export type Error =
-  | {
-      /**
-       * Reference to a unique workflow error definition. Used of errorRefs is not used
-       */
-      errorRef: string;
-      /**
-       * References one or more workflow error definitions. Used if errorRef is not used
-       */
-      errorRefs?: [string, ...string[]];
-      transition: Transition;
-      end?: End;
-    }
-  | {
-      /**
-       * Reference to a unique workflow error definition. Used of errorRefs is not used
-       */
-      errorRef: string;
-      /**
-       * References one or more workflow error definitions. Used if errorRef is not used
-       */
-      errorRefs?: [string, ...string[]];
-      transition?: Transition;
-      end: End;
-    }
-  | {
-      /**
-       * Reference to a unique workflow error definition. Used of errorRefs is not used
-       */
-      errorRef?: string;
-      /**
-       * References one or more workflow error definitions. Used if errorRef is not used
-       */
-      errorRefs: [string, ...string[]];
-      transition: Transition;
-      end?: End;
-    }
-  | {
-      /**
-       * Reference to a unique workflow error definition. Used of errorRefs is not used
-       */
-      errorRef?: string;
-      /**
-       * References one or more workflow error definitions. Used if errorRef is not used
-       */
-      errorRefs: [string, ...string[]];
-      transition?: Transition;
-      end: End;
-    };
-export interface Errordef {
-  /**
-   * Domain-specific error name
-   */
-  name: string;
-  /**
-   * Error code. Can be used in addition to the name to help runtimes resolve to technical errors/exceptions. Should not be defined if error is set to '*'
-   */
-  code?: string;
-  /**
-   * Error description
-   */
-  description?: string;
-}
-export type Errors = string /* uri */ | [Errordef, ...Errordef[]];
-/**
- * Timeout duration to wait for consuming defined events (ISO 8601 duration format)
- */
-export type EventTimeout = string;
-/**
- * Permits transitions to other states based on events
- */
-export interface Eventbasedswitch {
-  /**
-   * Unique State id
-   */
-  id?: string;
-  /**
-   * State name
-   */
-  name: string;
-  /**
-   * State type
-   */
-  type: 'switch';
-  /**
-   * State data filter
-   */
-  stateDataFilter?: Statedatafilter;
-  /**
-   * State specific timeouts
-   */
-  timeouts?: {
-    stateExecTimeout?: StateExecTimeout;
-    eventTimeout?: /* Timeout duration to wait for consuming defined events (ISO 8601 duration format) */ EventTimeout;
-  };
-  /**
-   * Defines conditions evaluated against events
-   */
-  eventConditions: Eventcondition[];
-  /**
-   * States error handling definitions
-   */
-  onErrors?: Error[];
-  /**
-   * Default transition of the workflow if there is no matching data conditions. Can include a transition or end definition
-   */
-  defaultCondition?: /* DefaultCondition definition. Can be either a transition or end definition */ Defaultconditiondef;
-  /**
-   * Unique Name of a workflow state which is responsible for compensation of this state
-   */
-  compensatedBy?: string;
-  /**
-   * If true, this state is used to compensate another state. Default is false
-   */
-  usedForCompensation?: boolean;
-  metadata?: /* Metadata information */ Metadata;
-}
-export type Eventcondition /* Switch state data event condition */ =
-  | Transitioneventcondition
-  | /* Switch state data event condition */ Enddeventcondition;
-export interface Eventdatafilter {
-  /**
-   * Workflow expression that filters the received event/payload (default: '${ . }')
-   */
-  data?: string;
-  /**
-   *  Workflow expression that selects a state data element to which the filtered event should be added/merged into. If not specified, denotes, the top-level state data element.
-   */
-  toStateData?: string;
-}
-export interface Eventdef {
-  /**
-   * Unique event name
-   */
-  name?: string;
-  /**
-   * CloudEvent source
-   */
-  source?: string;
-  /**
-   * CloudEvent type
-   */
-  type?: string;
-  /**
-   * Defines the CloudEvent as either 'consumed' or 'produced' by the workflow. Default is 'consumed'
-   */
-  kind?: 'consumed' | 'produced';
-  /**
-   * CloudEvent correlation definitions
-   */
-  correlation?: [
-    /* CloudEvent correlation definition */ CorrelationDef,
-    .../* CloudEvent correlation definition */ CorrelationDef[]
-  ];
-  /**
-   * If `true`, only the Event payload is accessible to consuming Workflow states. If `false`, both event payload and context attributes should be accessible
-   */
-  dataOnly?: boolean;
-  /**
-   * Metadata information
-   */
-  metadata?: /* Metadata information */ Metadata;
-}
-/**
- * Event References
- */
-export interface Eventref {
-  /**
-   * Reference to the unique name of a 'produced' event definition
-   */
-  triggerEventRef: string;
-  /**
-   * Reference to the unique name of a 'consumed' event definition
-   */
-  resultEventRef: string;
-  /**
-   * If string type, an expression which selects parts of the states data output to become the data (payload) of the event referenced by 'triggerEventRef'. If object type, a custom object to become the data (payload) of the event referenced by 'triggerEventRef'.
-   */
-  data?:
-    | string
-    | {
-        [key: string]: any;
-      };
-  /**
-   * Add additional extension context attributes to the produced event
-   */
-  contextAttributes?: {
-    [name: string]: string;
-  };
-}
-export type Events = string /* uri */ | [Eventdef, ...Eventdef[]];
-/**
- * This state is used to wait for events from event sources, then consumes them and invoke one or more actions to run in sequence or parallel
- */
-export type Eventstate =
-  /* This state is used to wait for events from event sources, then consumes them and invoke one or more actions to run in sequence or parallel */
-  | {
-      /**
-       * Unique State id
-       */
-      id?: string;
-      /**
-       * State name
-       */
-      name: string;
-      /**
-       * State type
-       */
-      type: 'event';
-      /**
-       * If true consuming one of the defined events causes its associated actions to be performed. If false all of the defined events must be consumed in order for actions to be performed
-       */
-      exclusive?: boolean;
-      /**
-       * Define the events to be consumed and optional actions to be performed
-       */
-      onEvents: Onevents[];
-      /**
-       * State specific timeouts
-       */
-      timeouts?: {
-        stateExecTimeout?: StateExecTimeout;
-        actionExecTimeout?: /* Single actions definition execution timeout duration (ISO 8601 duration format) */ ActionExecTimeout;
-        eventTimeout?: /* Timeout duration to wait for consuming defined events (ISO 8601 duration format) */ EventTimeout;
-      };
-      stateDataFilter?: Statedatafilter;
-      /**
-       * States error handling definitions
-       */
-      onErrors?: Error[];
-      transition?: Transition;
-      end: End;
-      /**
-       * Unique Name of a workflow state which is responsible for compensation of this state
-       */
-      compensatedBy?: string;
-      metadata?: /* Metadata information */ Metadata;
-    }
-  | {
-      /**
-       * Unique State id
-       */
-      id?: string;
-      /**
-       * State name
-       */
-      name: string;
-      /**
-       * State type
-       */
-      type: 'event';
-      /**
-       * If true consuming one of the defined events causes its associated actions to be performed. If false all of the defined events must be consumed in order for actions to be performed
-       */
-      exclusive?: boolean;
-      /**
-       * Define the events to be consumed and optional actions to be performed
-       */
-      onEvents: Onevents[];
-      /**
-       * State specific timeouts
-       */
-      timeouts?: {
-        stateExecTimeout?: StateExecTimeout;
-        actionExecTimeout?: /* Single actions definition execution timeout duration (ISO 8601 duration format) */ ActionExecTimeout;
-        eventTimeout?: /* Timeout duration to wait for consuming defined events (ISO 8601 duration format) */ EventTimeout;
-      };
-      stateDataFilter?: Statedatafilter;
-      /**
-       * States error handling definitions
-       */
-      onErrors?: Error[];
-      transition: Transition;
-      end?: End;
-      /**
-       * Unique Name of a workflow state which is responsible for compensation of this state
-       */
-      compensatedBy?: string;
-      metadata?: /* Metadata information */ Metadata;
-    };
-/**
- * Execute a set of defined actions or workflows for each element of a data array
- */
-export interface Foreachstate {
-  /**
-   * Unique State id
-   */
-  id?: string;
-  /**
-   * State name
-   */
-  name?: string;
-  /**
-   * State type
-   */
-  type?: 'foreach';
-  /**
-   * State end definition
-   */
-  end?: End;
-  /**
-   * Workflow expression selecting an array element of the states data
-   */
-  inputCollection?: string;
-  /**
-   * Workflow expression specifying an array element of the states data to add the results of each iteration
-   */
-  outputCollection?: string;
-  /**
-   * Name of the iteration parameter that can be referenced in actions/workflow. For each parallel iteration, this param should contain an unique element of the inputCollection array
-   */
-  iterationParam?: string;
-  /**
-   * Specifies how many iterations may run in parallel at the same time. Used if 'mode' property is set to 'parallel' (default)
-   */
-  batchSize?: number | string;
-  /**
-   * Actions to be executed for each of the elements of inputCollection
-   */
-  actions?: Action[];
-  /**
-   * State specific timeouts
-   */
-  timeouts?: {
-    stateExecTimeout?: StateExecTimeout;
-    actionExecTimeout?: /* Single actions definition execution timeout duration (ISO 8601 duration format) */ ActionExecTimeout;
-  };
-  /**
-   * State data filter
-   */
-  stateDataFilter?: Statedatafilter;
-  /**
-   * States error handling definitions
-   */
-  onErrors?: Error[];
-  /**
-   * Next transition of the workflow after state has completed
-   */
-  transition?: Transition;
-  /**
-   * Unique Name of a workflow state which is responsible for compensation of this state
-   */
-  compensatedBy?: string;
-  /**
-   * If true, this state is used to compensate another state. Default is false
-   */
-  usedForCompensation?: boolean;
-  /**
-   * Specifies how iterations are to be performed (sequentially or in parallel)
-   */
-  mode?: 'sequential' | 'parallel';
-  metadata?: /* Metadata information */ Metadata;
-}
-export interface Function {
-  /**
-   * Unique function name
-   */
-  name: string;
-  /**
-   * If type is `rest`, #. If type is `asyncapi`, #. If type is `rpc`, ##. If type is `graphql`, ##. If type is `odata`, #. If type is `expression`, defines the workflow expression.
-   */
-  operation: string;
-  /**
-   * Defines the function type. Is either `rest`, `asyncapi, `rpc`, `graphql`, `odata`, or `expression`. Default is `rest`
-   */
-  type?: 'rest' | 'asyncapi' | 'rpc' | 'graphql' | 'odata' | 'expression';
-  /**
-   * References an auth definition name to be used to access to resource defined in the operation parameter
-   */
-  authRef?: string;
-  metadata?: /* Metadata information */ Metadata;
-}
-export type Functionref =
-  | string
-  | {
-      /**
-       * Name of the referenced function
-       */
-      refName: string;
-      /**
-       * Function arguments/inputs
-       */
-      arguments?: {
-        [key: string]: any;
-      };
-      /**
-       * Only used if function type is 'graphql'. A string containing a valid GraphQL selection set
-       */
-      selectionSet?: string;
-    };
-export type Functions = string /* uri */ | [Function, ...Function[]];
-/**
- * Inject static data into state data. Does not perform any actions
- */
-export interface Injectstate {
-  /**
-   * Unique state id
-   */
-  id?: string;
-  /**
-   * State name
-   */
-  name?: string;
-  /**
-   * State type
-   */
-  type?: 'inject';
-  /**
-   * State end definition
-   */
-  end?: End;
-  /**
-   * JSON object which can be set as states data input and can be manipulated via filters
-   */
-  data?: {
-    [key: string]: any;
-  };
-  /**
-   * State specific timeouts
-   */
-  timeouts?: {
-    stateExecTimeout?: StateExecTimeout;
-  };
-  /**
-   * State data filter
-   */
-  stateDataFilter?: Statedatafilter;
-  /**
-   * Next transition of the workflow after injection has completed
-   */
-  transition?: Transition;
-  /**
-   * Unique Name of a workflow state which is responsible for compensation of this state
-   */
-  compensatedBy?: string;
-  /**
-   * If true, this state is used to compensate another state. Default is false
-   */
-  usedForCompensation?: boolean;
-  metadata?: /* Metadata information */ Metadata;
-}
-/**
- * Metadata information
- */
-export interface Metadata {
-  [name: string]: string;
-}
-export type Oauth2propsdef =
-  | string
-  | {
-      /**
-       * String or a workflow expression. Contains the authority information
-       */
-      authority?: string;
-      /**
-       * Defines the grant type
-       */
-      grantType: 'password' | 'clientCredentials' | 'tokenExchange';
-      /**
-       * String or a workflow expression. Contains the client identifier
-       */
-      clientId: string;
-      /**
-       * Workflow secret or a workflow expression. Contains the client secret
-       */
-      clientSecret?: string;
-      /**
-       * Array containing strings or workflow expressions. Contains the OAuth2 scopes
-       */
-      scopes?: [string, ...string[]];
-      /**
-       * String or a workflow expression. Contains the user name. Used only if grantType is 'resourceOwner'
-       */
-      username?: string;
-      /**
-       * String or a workflow expression. Contains the user password. Used only if grantType is 'resourceOwner'
-       */
-      password?: string;
-      /**
-       * Array containing strings or workflow expressions. Contains the OAuth2 audiences
-       */
-      audiences?: [string, ...string[]];
-      /**
-       * String or a workflow expression. Contains the subject token
-       */
-      subjectToken?: string;
-      /**
-       * String or a workflow expression. Contains the requested subject
-       */
-      requestedSubject?: string;
-      /**
-       * String or a workflow expression. Contains the requested issuer
-       */
-      requestedIssuer?: string;
-      metadata?: /* Metadata information */ Metadata;
-    };
-export interface Onevents {
-  /**
-   * References one or more unique event names in the defined workflow events
-   */
-  eventRefs: [string, ...string[]];
-  /**
-   * Specifies how actions are to be performed (in sequence or in parallel)
-   */
-  actionMode?: 'sequential' | 'parallel';
-  /**
-   * Actions to be performed if expression matches
-   */
-  actions?: Action[];
-  /**
-   * Event data filter
-   */
-  eventDataFilter?: Eventdatafilter;
-}
-/**
- * Defines actions be performed. Does not wait for incoming events
- */
-export interface Operationstate {
-  /**
-   * Unique State id
-   */
-  id?: string;
-  /**
-   * State name
-   */
-  name?: string;
-  /**
-   * State type
-   */
-  type?: 'operation';
-  /**
-   * State end definition
-   */
-  end?: End;
-  /**
-   * State data filter
-   */
-  stateDataFilter?: Statedatafilter;
-  /**
-   * Specifies whether actions are performed in sequence or in parallel
-   */
-  actionMode?: 'sequential' | 'parallel';
-  /**
-   * Actions to be performed
-   */
-  actions?: Action[];
-  /**
-   * State specific timeouts
-   */
-  timeouts?: {
-    stateExecTimeout?: StateExecTimeout;
-    actionExecTimeout?: /* Single actions definition execution timeout duration (ISO 8601 duration format) */ ActionExecTimeout;
-  };
-  /**
-   * States error handling definitions
-   */
-  onErrors?: Error[];
-  /**
-   * Next transition of the workflow after all the actions have been performed
-   */
-  transition?: Transition;
-  /**
-   * Unique Name of a workflow state which is responsible for compensation of this state
-   */
-  compensatedBy?: string;
-  /**
-   * If true, this state is used to compensate another state. Default is false
-   */
-  usedForCompensation?: boolean;
-  metadata?: /* Metadata information */ Metadata;
-}
-/**
- * Consists of a number of states that are executed in parallel
- */
-export interface Parallelstate {
-  /**
-   * Unique State id
-   */
-  id?: string;
-  /**
-   * State name
-   */
-  name?: string;
-  /**
-   * State type
-   */
-  type?: 'parallel';
-  /**
-   * State end definition
-   */
-  end?: End;
-  /**
-   * State data filter
-   */
-  stateDataFilter?: Statedatafilter;
-  /**
-   * State specific timeouts
-   */
-  timeouts?: {
-    stateExecTimeout?: StateExecTimeout;
-    branchExecTimeout?: /* Single branch execution timeout duration (ISO 8601 duration format) */ BranchExecTimeout;
-  };
-  /**
-   * Branch Definitions
-   */
-  branches?: /* Branch Definition */ Branch[];
-  /**
-   * Option types on how to complete branch execution.
-   */
-  completionType?: 'allOf' | 'atLeast';
-  /**
-   * Used when completionType is set to 'atLeast' to specify the minimum number of branches that must complete before the state will transition.
-   */
-  numCompleted?: number | string;
-  /**
-   * States error handling definitions
-   */
-  onErrors?: Error[];
-  /**
-   * Next transition of the workflow after all branches have completed execution
-   */
-  transition?: Transition;
-  /**
-   * Unique Name of a workflow state which is responsible for compensation of this state
-   */
-  compensatedBy?: string;
-  /**
-   * If true, this state is used to compensate another state. Default is false
-   */
-  usedForCompensation?: boolean;
-  metadata?: /* Metadata information */ Metadata;
-}
-/**
- * Produce an event and set its data
- */
-export interface Produceeventdef {
-  /**
-   * References a name of a defined event
-   */
-  eventRef: string;
-  /**
-   * If String, expression which selects parts of the states data output to become the data of the produced event. If object a custom object to become the data of produced event.
-   */
-  data?:
-    | string
-    | {
-        [key: string]: any;
-      };
-  /**
-   * Add additional event extension context attributes
-   */
-  contextAttributes?: {
-    [name: string]: string;
-  };
-}
-export type Retries = string /* uri */ | [Retrydef, ...Retrydef[]];
-export interface Retrydef {
-  /**
-   * Unique retry strategy name
-   */
-  name: string;
-  /**
-   * Time delay between retry attempts (ISO 8601 duration format)
-   */
-  delay?: string;
-  /**
-   * Maximum time delay between retry attempts (ISO 8601 duration format)
-   */
-  maxDelay?: string;
-  /**
-   * Static value by which the delay increases during each attempt (ISO 8601 time format)
-   */
-  increment?: string;
-  /**
-   * Numeric value, if specified the delay between retries is multiplied by this value.
-   */
-  multiplier?: number | string;
-  /**
-   * Maximum number of retry attempts.
-   */
-  maxAttempts: number | string;
-  /**
-   * If float type, maximum amount of random time added or subtracted from the delay between each retry relative to total delay (between 0 and 1). If string type, absolute maximum amount of random time added or subtracted from the delay between each retry (ISO 8601 duration format)
-   */
-  jitter?: number | string;
-}
-export type Schedule =
-  | string
-  | /* Start state schedule definition */ (
-      | {
-          /**
-           * Time interval (must be repeating interval) described with ISO 8601 format. Declares when workflow instances will be automatically created.
-           */
-          interval: string;
-          cron?: Crondef;
-          /**
-           * Timezone name used to evaluate the interval & cron-expression. (default: UTC)
-           */
-          timezone?: string;
-        }
-      | {
-          /**
-           * Time interval (must be repeating interval) described with ISO 8601 format. Declares when workflow instances will be automatically created.
-           */
-          interval?: string;
-          cron: Crondef;
-          /**
-           * Timezone name used to evaluate the interval & cron-expression. (default: UTC)
-           */
-          timezone?: string;
-        }
-    );
-export type Secrets = string /* uri */ | [string, ...string[]];
-export type Sleep =
-  | {
-      /**
-       * Amount of time (ISO 8601 duration format) to sleep before function/subflow invocation. Does not apply if 'eventRef' is defined.
-       */
-      before: string;
-      /**
-       * Amount of time (ISO 8601 duration format) to sleep after function/subflow invocation. Does not apply if 'eventRef' is defined.
-       */
-      after?: string;
-    }
-  | {
-      /**
-       * Amount of time (ISO 8601 duration format) to sleep before function/subflow invocation. Does not apply if 'eventRef' is defined.
-       */
-      before?: string;
-      /**
-       * Amount of time (ISO 8601 duration format) to sleep after function/subflow invocation. Does not apply if 'eventRef' is defined.
-       */
-      after: string;
-    }
-  | {
-      /**
-       * Amount of time (ISO 8601 duration format) to sleep before function/subflow invocation. Does not apply if 'eventRef' is defined.
-       */
-      before: string;
-      /**
-       * Amount of time (ISO 8601 duration format) to sleep after function/subflow invocation. Does not apply if 'eventRef' is defined.
-       */
-      after: string;
-    };
-/**
- * Causes the workflow execution to sleep for a specified duration
- */
-export interface Sleepstate {
-  /**
-   * Unique State id
-   */
-  id?: string;
-  /**
-   * State name
-   */
-  name?: string;
-  /**
-   * State type
-   */
-  type?: 'sleep';
-  /**
-   * State end definition
-   */
-  end?: End;
-  /**
-   * State data filter
-   */
-  stateDataFilter?: Statedatafilter;
-  /**
-   * Duration (ISO 8601 duration format) to sleep
-   */
-  duration?: string;
-  /**
-   * State specific timeouts
-   */
-  timeouts?: {
-    stateExecTimeout?: StateExecTimeout;
-  };
-  /**
-   * States error handling definitions
-   */
-  onErrors?: Error[];
-  /**
-   * Next transition of the workflow after the workflow sleep
-   */
-  transition?: Transition;
-  /**
-   * Unique Name of a workflow state which is responsible for compensation of this state
-   */
-  compensatedBy?: string;
-  /**
-   * If true, this state is used to compensate another state. Default is false
-   */
-  usedForCompensation?: boolean;
-  metadata?: /* Metadata information */ Metadata;
-}
-export type Startdef =
-  | string
-  | {
-      /**
-       * Name of the starting workflow state
-       */
-      stateName: string;
-      /**
-       * Define the time/repeating intervals or cron at which workflow instances should be automatically started.
-       */
-      schedule: Schedule;
-    };
-export type StateExecTimeout =
-  | string
-  | {
-      /**
-       * Single state execution timeout, not including retries (ISO 8601 duration format)
-       */
-      single?: string;
-      /**
-       * Total state execution timeout, including retries (ISO 8601 duration format)
-       */
-      total: string;
-    };
-export interface Statedatafilter {
-  /**
-   * Workflow expression to filter the state data input
-   */
-  input?: string;
-  /**
-   * Workflow expression that filters the state data output
-   */
-  output?: string;
-}
-export type Subflowref =
-  | string
-  | {
-      /**
-       * Unique id of the sub-workflow to be invoked
-       */
-      workflowId: string;
-      /**
-       * Version of the sub-workflow to be invoked
-       */
-      version?: string;
-    };
-export type Switchstate /* Permits transitions to other states based on data conditions */ =
-  | Databasedswitch
-  | /* Permits transitions to other states based on events */ Eventbasedswitch;
-export type Timeouts =
-  | string /* uri */
-  | {
-      workflowExecTimeout?: WorkflowExecTimeout;
-      stateExecTimeout?: StateExecTimeout;
-      actionExecTimeout?: /* Single actions definition execution timeout duration (ISO 8601 duration format) */ ActionExecTimeout;
-      branchExecTimeout?: /* Single branch execution timeout duration (ISO 8601 duration format) */ BranchExecTimeout;
-      eventTimeout?: /* Timeout duration to wait for consuming defined events (ISO 8601 duration format) */ EventTimeout;
-    };
-export type Transition =
-  | string
-  | {
-      /**
-       * Name of state to transition to
-       */
-      nextState: string;
-      /**
-       * Array of events to be produced before the transition happens
-       */
-      produceEvents?: /* Produce an event and set its data */ Produceeventdef[];
-      /**
-       * If set to true, triggers workflow compensation when before this transition is taken. Default is false
-       */
-      compensate?: boolean;
-    };
-/**
- * Switch state data based condition
- */
-export interface Transitiondatacondition {
-  /**
-   * Data condition name
-   */
-  name?: string;
-  /**
-   * Workflow expression evaluated against state data. Must evaluate to true or false
-   */
-  condition: string;
-  /**
-   * Workflow transition if condition is evaluated to true
-   */
-  transition: Transition;
-  metadata?: /* Metadata information */ Metadata;
-}
-/**
- * Switch state data event condition
- */
-export interface Transitioneventcondition {
-  /**
-   * Event condition name
-   */
-  name?: string;
-  /**
-   * References an unique event name in the defined workflow events
-   */
-  eventRef: string;
-  /**
-   * Next transition of the workflow if there is valid matches
-   */
-  transition: Transition;
-  /**
-   * Event data filter definition
-   */
-  eventDataFilter?: Eventdatafilter;
-  metadata?: /* Metadata information */ Metadata;
-}
-export type WorkflowExecTimeout =
-  | string
-  | {
-      /**
-       * Workflow execution timeout duration (ISO 8601 duration format). If not specified should be 'unlimited'
-       */
-      duration: string;
-      /**
-       * If `false`, workflow instance is allowed to finish current execution. If `true`, current workflow execution is abrupted.
-       */
-      interrupt?: boolean;
-      /**
-       * Name of a workflow state to be executed before workflow instance is terminated
-       */
-      runBefore?: string;
-    };
diff --git a/src/lib/schema/validation/validators-paths.ts b/src/lib/schema/validation/validators-paths.ts
deleted file mode 100644
index e3b0cf4e..00000000
--- a/src/lib/schema/validation/validators-paths.ts
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * A map of type names and their corresponding schema
- */
-export const validatorsPaths: [string, string][] = [
-  ['Workflow', 'https://serverlessworkflow.io/schemas/0.7/workflow.json'],
-  ['Sleep', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/sleep'],
-  ['Crondef', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/crondef'],
-  ['Continueasdef', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/continueasdef'],
-  ['Transition', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/transition'],
-  ['Error', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/error'],
-  ['Onevents', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/onevents'],
-  ['Action', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/action'],
-  ['Functionref', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/functionref'],
-  ['Eventref', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/eventref'],
-  ['Subflowref', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/subflowref'],
-  ['Branch', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/branch'],
-  ['Sleepstate', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/sleepstate'],
-  ['Eventstate', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/eventstate'],
-  ['Operationstate', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/operationstate'],
-  ['Parallelstate', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/parallelstate'],
-  ['Switchstate', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/switchstate'],
-  ['Eventbasedswitch', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/eventbasedswitch'],
-  ['Databasedswitch', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/databasedswitch'],
-  ['Defaultconditiondef', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/defaultconditiondef'],
-  ['Eventcondition', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/eventcondition'],
-  [
-    'Transitioneventcondition',
-    'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/transitioneventcondition',
-  ],
-  ['Enddeventcondition', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/enddeventcondition'],
-  ['Datacondition', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/datacondition'],
-  [
-    'Transitiondatacondition',
-    'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/transitiondatacondition',
-  ],
-  ['Enddatacondition', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/enddatacondition'],
-  ['Injectstate', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/injectstate'],
-  ['Foreachstate', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/foreachstate'],
-  ['Callbackstate', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/callbackstate'],
-  ['Startdef', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/startdef'],
-  ['Schedule', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/schedule'],
-  ['End', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/end'],
-  ['Produceeventdef', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/produceeventdef'],
-  ['Statedatafilter', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/statedatafilter'],
-  ['Eventdatafilter', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/eventdatafilter'],
-  ['Actiondatafilter', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/actiondatafilter'],
-  ['Metadata', 'https://serverlessworkflow.io/schemas/0.7/common.json#/definitions/metadata'],
-  ['WorkflowExecTimeout', 'https://serverlessworkflow.io/schemas/0.7/timeouts.json#/definitions/workflowExecTimeout'],
-  ['StateExecTimeout', 'https://serverlessworkflow.io/schemas/0.7/timeouts.json#/definitions/stateExecTimeout'],
-  ['ActionExecTimeout', 'https://serverlessworkflow.io/schemas/0.7/timeouts.json#/definitions/actionExecTimeout'],
-  ['BranchExecTimeout', 'https://serverlessworkflow.io/schemas/0.7/timeouts.json#/definitions/branchExecTimeout'],
-  ['EventTimeout', 'https://serverlessworkflow.io/schemas/0.7/timeouts.json#/definitions/eventTimeout'],
-  ['Retrydef', 'https://serverlessworkflow.io/schemas/0.7/retries.json#/definitions/retrydef'],
-  ['Function', 'https://serverlessworkflow.io/schemas/0.7/functions.json#/definitions/function'],
-  ['Errordef', 'https://serverlessworkflow.io/schemas/0.7/errors.json#/definitions/errordef'],
-  ['Eventdef', 'https://serverlessworkflow.io/schemas/0.7/events.json#/definitions/eventdef'],
-  ['CorrelationDef', 'https://serverlessworkflow.io/schemas/0.7/events.json#/definitions/correlationDef'],
-  ['Authdef', 'https://serverlessworkflow.io/schemas/0.7/auth.json#/definitions/authdef'],
-  ['Basicpropsdef', 'https://serverlessworkflow.io/schemas/0.7/auth.json#/definitions/basicpropsdef'],
-  ['Bearerpropsdef', 'https://serverlessworkflow.io/schemas/0.7/auth.json#/definitions/bearerpropsdef'],
-  ['Oauth2propsdef', 'https://serverlessworkflow.io/schemas/0.7/auth.json#/definitions/oauth2propsdef'],
-  ['Secrets', 'https://serverlessworkflow.io/schemas/0.7/secrets.json#/secrets'],
-  ['Timeouts', 'https://serverlessworkflow.io/schemas/0.7/timeouts.json#/timeouts'],
-  ['Errors', 'https://serverlessworkflow.io/schemas/0.7/errors.json#/errors'],
-  ['Events', 'https://serverlessworkflow.io/schemas/0.7/events.json#/events'],
-  ['Functions', 'https://serverlessworkflow.io/schemas/0.7/functions.json#/functions'],
-  ['Retries', 'https://serverlessworkflow.io/schemas/0.7/retries.json#/retries'],
-  ['Auth', 'https://serverlessworkflow.io/schemas/0.7/auth.json#/auth'],
-];
diff --git a/src/lib/schema/workflow.json b/src/lib/schema/workflow.json
deleted file mode 100644
index b7a7fc21..00000000
--- a/src/lib/schema/workflow.json
+++ /dev/null
@@ -1,1953 +0,0 @@
-{
-  "$id": "https://serverlessworkflow.io/schemas/0.7/workflow.json",
-  "$schema": "http://json-schema.org/draft-07/schema#",
-  "description": "Serverless Workflow specification - workflow schema",
-  "type": "object",
-  "properties": {
-    "id": {
-      "type": "string",
-      "description": "Workflow unique identifier",
-      "minLength": 1
-    },
-    "key": {
-      "type": "string",
-      "description": "Domain-specific workflow identifier",
-      "minLength": 1
-    },
-    "name": {
-      "type": "string",
-      "description": "Workflow name",
-      "minLength": 1
-    },
-    "description": {
-      "type": "string",
-      "description": "Workflow description"
-    },
-    "version": {
-      "type": "string",
-      "description": "Workflow version",
-      "minLength": 1
-    },
-    "annotations": {
-      "type": "array",
-      "description": "List of helpful terms describing the workflows intended purpose, subject areas, or other important qualities",
-      "minItems": 1,
-      "items": {
-        "type": "string"
-      },
-      "additionalItems": false
-    },
-    "dataInputSchema": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "URI of the JSON Schema used to validate the workflow data input",
-          "minLength": 1
-        },
-        {
-          "type": "object",
-          "description": "Workflow data input schema definition",
-          "properties": {
-            "schema": {
-              "type": "string",
-              "description": "URI of the JSON Schema used to validate the workflow data input",
-              "minLength": 1
-            },
-            "failOnValidationErrors": {
-              "type": "boolean",
-              "default": true,
-              "description": "Determines if workflow execution should continue if there are validation errors"
-            }
-          },
-          "additionalProperties": false,
-          "required": [
-            "schema",
-            "failOnValidationErrors"
-          ]
-        }
-      ]
-    },
-    "secrets": {
-      "$ref": "secrets.json#/secrets"
-    },
-    "constants": {
-      "oneOf": [
-        {
-          "type": "string",
-          "format": "uri",
-          "description": "URI to a resource containing constants data (json or yaml)"
-        },
-        {
-          "type": "object",
-          "description": "Workflow constants data (object type)"
-        }
-      ]
-    },
-    "start": {
-      "$ref": "#/definitions/startdef"
-    },
-    "specVersion": {
-      "type": "string",
-      "description": "Serverless Workflow schema version",
-      "minLength": 1
-    },
-    "expressionLang": {
-      "type": "string",
-      "description": "Identifies the expression language used for workflow expressions. Default is 'jq'",
-      "default": "jq",
-      "minLength": 1
-    },
-    "timeouts": {
-      "$ref": "timeouts.json#/timeouts"
-    },
-    "errors": {
-      "$ref": "errors.json#/errors"
-    },
-    "keepActive": {
-      "type": "boolean",
-      "default": false,
-      "description": "If 'true', workflow instances is not terminated when there are no active execution paths. Instance can be terminated via 'terminate end definition' or reaching defined 'workflowExecTimeout'"
-    },
-    "metadata": {
-      "$ref": "common.json#/definitions/metadata"
-    },
-    "events": {
-      "$ref": "events.json#/events"
-    },
-    "functions": {
-      "$ref": "functions.json#/functions"
-    },
-    "autoRetries": {
-      "type": "boolean",
-      "default": false,
-      "description": "If set to true, actions should automatically be retried on unchecked errors. Default is false"
-    },
-    "retries": {
-      "$ref": "retries.json#/retries"
-    },
-    "auth": {
-      "$ref": "auth.json#/auth"
-    },
-    "states": {
-      "type": "array",
-      "description": "State definitions",
-      "items": {
-        "anyOf": [
-          {
-            "title": "Sleep State",
-            "$ref": "#/definitions/sleepstate"
-          },
-          {
-            "title": "Event State",
-            "$ref": "#/definitions/eventstate"
-          },
-          {
-            "title": "Operation State",
-            "$ref": "#/definitions/operationstate"
-          },
-          {
-            "title": "Parallel State",
-            "$ref": "#/definitions/parallelstate"
-          },
-          {
-            "title": "Switch State",
-            "$ref": "#/definitions/switchstate"
-          },
-          {
-            "title": "Inject State",
-            "$ref": "#/definitions/injectstate"
-          },
-          {
-            "title": "ForEach State",
-            "$ref": "#/definitions/foreachstate"
-          },
-          {
-            "title": "Callback State",
-            "$ref": "#/definitions/callbackstate"
-          }
-        ]
-      },
-      "additionalItems": false,
-      "minItems": 1
-    }
-  },
-  "oneOf": [
-    {
-      "required": [
-        "id",
-        "specVersion",
-        "name",
-        "start",
-        "states"
-      ]
-    },
-    {
-      "required": [
-        "key",
-        "specVersion",
-        "name",
-        "start",
-        "states"
-      ]
-    }
-  ],
-  "definitions": {
-    "sleep": {
-      "type": "object",
-      "properties": {
-        "before": {
-          "type": "string",
-          "description": "Amount of time (ISO 8601 duration format) to sleep before function/subflow invocation. Does not apply if 'eventRef' is defined."
-        },
-        "after": {
-          "type": "string",
-          "description": "Amount of time (ISO 8601 duration format) to sleep after function/subflow invocation. Does not apply if 'eventRef' is defined."
-        }
-      },
-      "oneOf": [
-        {
-          "required": [
-            "before"
-          ]
-        },
-        {
-          "required": [
-            "after"
-          ]
-        },
-        {
-          "required": [
-            "before",
-            "after"
-          ]
-        }
-      ]
-    },
-    "crondef": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Cron expression defining when workflow instances should be created (automatically)",
-          "minLength": 1
-        },
-        {
-          "type": "object",
-          "properties": {
-            "expression": {
-              "type": "string",
-              "description": "Repeating interval (cron expression) describing when the workflow instance should be created",
-              "minLength": 1
-            },
-            "validUntil": {
-              "type": "string",
-              "description": "Specific date and time (ISO 8601 format) when the cron expression invocation is no longer valid"
-            }
-          },
-          "additionalProperties": false,
-          "required": [
-            "expression"
-          ]
-        }
-      ]
-    },
-    "continueasdef": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Unique id of the workflow to be continue execution as. Entire state data is passed as data input to next execution",
-          "minLength": 1
-        },
-        {
-          "type": "object",
-          "properties": {
-            "workflowId": {
-              "type": "string",
-              "description": "Unique id of the workflow to continue execution as"
-            },
-            "version": {
-              "type": "string",
-              "description": "Version of the workflow to continue execution as",
-              "minLength": 1
-            },
-            "data": {
-              "type": [
-                "string",
-                "object"
-              ],
-              "description": "If string type, an expression which selects parts of the states data output to become the workflow data input of continued execution. If object type, a custom object to become the workflow data input of the continued execution"
-            },
-            "workflowExecTimeout": {
-              "$ref": "timeouts.json#/definitions/workflowExecTimeout",
-              "description": "Workflow execution timeout to be used by the workflow continuing execution. Overwrites any specific settings set by that workflow"
-            }
-          },
-          "required": [
-            "workflowId"
-          ]
-        }
-      ]
-    },
-    "transition": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Name of state to transition to",
-          "minLength": 1
-        },
-        {
-          "type": "object",
-          "description": "Function Reference",
-          "properties": {
-            "nextState": {
-              "type": "string",
-              "description": "Name of state to transition to",
-              "minLength": 1
-            },
-            "produceEvents": {
-              "type": "array",
-              "description": "Array of events to be produced before the transition happens",
-              "items": {
-                "type": "object",
-                "$ref": "#/definitions/produceeventdef"
-              },
-              "additionalItems": false
-            },
-            "compensate": {
-              "type": "boolean",
-              "default": false,
-              "description": "If set to true, triggers workflow compensation when before this transition is taken. Default is false"
-            }
-          },
-          "additionalProperties": false,
-          "required": [
-            "nextState"
-          ]
-        }
-      ]
-    },
-    "error": {
-      "type": "object",
-      "properties": {
-        "errorRef": {
-          "type": "string",
-          "description": "Reference to a unique workflow error definition. Used of errorRefs is not used",
-          "minLength": 1
-        },
-        "errorRefs": {
-          "type": "array",
-          "description": "References one or more workflow error definitions. Used if errorRef is not used",
-          "minItems": 1,
-          "items": {
-            "type": "string"
-          },
-          "additionalItems": false
-        },
-        "transition": {
-          "description": "Transition to next state to handle the error.",
-          "$ref": "#/definitions/transition"
-        },
-        "end": {
-          "description": "End workflow execution in case of this error.",
-          "$ref": "#/definitions/end"
-        }
-      },
-      "additionalProperties": false,
-      "oneOf": [
-        {
-          "required": [
-            "errorRef",
-            "transition"
-          ]
-        },
-        {
-          "required": [
-            "errorRef",
-            "end"
-          ]
-        },
-        {
-          "required": [
-            "errorRefs",
-            "transition"
-          ]
-        },
-        {
-          "required": [
-            "errorRefs",
-            "end"
-          ]
-        }
-      ]
-    },
-    "onevents": {
-      "type": "object",
-      "properties": {
-        "eventRefs": {
-          "type": "array",
-          "description": "References one or more unique event names in the defined workflow events",
-          "minItems": 1,
-          "items": {
-            "type": "string"
-          },
-          "additionalItems": false
-        },
-        "actionMode": {
-          "type": "string",
-          "enum": [
-            "sequential",
-            "parallel"
-          ],
-          "description": "Specifies how actions are to be performed (in sequence or in parallel)",
-          "default": "sequential"
-        },
-        "actions": {
-          "type": "array",
-          "description": "Actions to be performed if expression matches",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/action"
-          },
-          "additionalItems": false
-        },
-        "eventDataFilter": {
-          "description": "Event data filter",
-          "$ref": "#/definitions/eventdatafilter"
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "eventRefs"
-      ]
-    },
-    "action": {
-      "type": "object",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Unique action definition name"
-        },
-        "functionRef": {
-          "description": "References a function to be invoked",
-          "$ref": "#/definitions/functionref"
-        },
-        "eventRef": {
-          "description": "References a 'trigger' and 'result' reusable event definitions",
-          "$ref": "#/definitions/eventref"
-        },
-        "subFlowRef": {
-          "description": "References a sub-workflow to invoke",
-          "$ref": "#/definitions/subflowref"
-        },
-        "sleep": {
-          "description": "Defines time periods workflow execution should sleep before / after function execution",
-          "$ref": "#/definitions/sleep"
-        },
-        "retryRef": {
-          "type": "string",
-          "description": "References a defined workflow retry definition. If not defined the default retry policy is assumed"
-        },
-        "nonRetryableErrors": {
-          "type": "array",
-          "description": "List of unique references to defined workflow errors for which the action should not be retried. Used only when `autoRetries` is set to `true`",
-          "minItems": 1,
-          "items": {
-            "type": "string"
-          },
-          "additionalItems": false
-        },
-        "retryableErrors": {
-          "type": "array",
-          "description": "List of unique references to defined workflow errors for which the action should be retried. Used only when `autoRetries` is set to `false`",
-          "minItems": 1,
-          "items": {
-            "type": "string"
-          },
-          "additionalItems": false
-        },
-        "actionDataFilter": {
-          "description": "Action data filter",
-          "$ref": "#/definitions/actiondatafilter"
-        }
-      },
-      "additionalProperties": false,
-      "oneOf": [
-        {
-          "required": [
-            "functionRef"
-          ]
-        },
-        {
-          "required": [
-            "eventRef"
-          ]
-        },
-        {
-          "required": [
-            "subFlowRef"
-          ]
-        }
-      ]
-    },
-    "functionref": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Name of the referenced function",
-          "minLength": 1
-        },
-        {
-          "type": "object",
-          "description": "Function Reference",
-          "properties": {
-            "refName": {
-              "type": "string",
-              "description": "Name of the referenced function"
-            },
-            "arguments": {
-              "type": "object",
-              "description": "Function arguments/inputs"
-            },
-            "selectionSet": {
-              "type": "string",
-              "description": "Only used if function type is 'graphql'. A string containing a valid GraphQL selection set"
-            }
-          },
-          "additionalProperties": false,
-          "required": [
-            "refName"
-          ]
-        }
-      ]
-    },
-    "eventref": {
-      "type": "object",
-      "description": "Event References",
-      "properties": {
-        "triggerEventRef": {
-          "type": "string",
-          "description": "Reference to the unique name of a 'produced' event definition"
-        },
-        "resultEventRef": {
-          "type": "string",
-          "description": "Reference to the unique name of a 'consumed' event definition"
-        },
-        "data": {
-          "type": [
-            "string",
-            "object"
-          ],
-          "description": "If string type, an expression which selects parts of the states data output to become the data (payload) of the event referenced by 'triggerEventRef'. If object type, a custom object to become the data (payload) of the event referenced by 'triggerEventRef'."
-        },
-        "contextAttributes": {
-          "type": "object",
-          "description": "Add additional extension context attributes to the produced event",
-          "additionalProperties": {
-            "type": "string"
-          }
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "triggerEventRef",
-        "resultEventRef"
-      ]
-    },
-    "subflowref": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Unique id of the sub-workflow to be invoked",
-          "minLength": 1
-        },
-        {
-          "type": "object",
-          "description": "Specifies a sub-workflow to be invoked",
-          "properties": {
-            "workflowId": {
-              "type": "string",
-              "description": "Unique id of the sub-workflow to be invoked"
-            },
-            "version": {
-              "type": "string",
-              "description": "Version of the sub-workflow to be invoked",
-              "minLength": 1
-            }
-          },
-          "required": [
-            "workflowId"
-          ]
-        }
-      ]
-    },
-    "branch": {
-      "type": "object",
-      "description": "Branch Definition",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Branch name"
-        },
-        "timeouts": {
-          "type": "object",
-          "description": "State specific timeouts",
-          "properties": {
-            "actionExecTimeout": {
-              "$ref": "timeouts.json#/definitions/actionExecTimeout"
-            },
-            "branchExecTimeout": {
-              "$ref": "timeouts.json#/definitions/branchExecTimeout"
-            }
-          },
-          "required": []
-        },
-        "actions": {
-          "type": "array",
-          "description": "Actions to be executed in this branch",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/action"
-          },
-          "additionalItems": false
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "name",
-        "actions"
-      ]
-    },
-    "sleepstate": {
-      "type": "object",
-      "description": "Causes the workflow execution to sleep for a specified duration",
-      "properties": {
-        "id": {
-          "type": "string",
-          "description": "Unique State id",
-          "minLength": 1
-        },
-        "name": {
-          "type": "string",
-          "description": "State name"
-        },
-        "type": {
-          "type": "string",
-          "const": "sleep",
-          "description": "State type"
-        },
-        "end": {
-          "$ref": "#/definitions/end",
-          "description": "State end definition"
-        },
-        "stateDataFilter": {
-          "description": "State data filter",
-          "$ref": "#/definitions/statedatafilter"
-        },
-        "duration": {
-          "type": "string",
-          "description": "Duration (ISO 8601 duration format) to sleep"
-        },
-        "timeouts": {
-          "type": "object",
-          "description": "State specific timeouts",
-          "properties": {
-            "stateExecTimeout": {
-              "$ref": "timeouts.json#/definitions/stateExecTimeout"
-            }
-          },
-          "required": []
-        },
-        "onErrors": {
-          "type": "array",
-          "description": "States error handling definitions",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/error"
-          },
-          "additionalItems": false
-        },
-        "transition": {
-          "description": "Next transition of the workflow after the workflow sleep",
-          "$ref": "#/definitions/transition"
-        },
-        "compensatedBy": {
-          "type": "string",
-          "minLength": 1,
-          "description": "Unique Name of a workflow state which is responsible for compensation of this state"
-        },
-        "usedForCompensation": {
-          "type": "boolean",
-          "default": false,
-          "description": "If true, this state is used to compensate another state. Default is false"
-        },
-        "metadata": {
-          "$ref": "common.json#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "if": {
-        "properties": {
-          "usedForCompensation": {
-            "const": true
-          }
-        },
-        "required": [
-          "usedForCompensation"
-        ]
-      },
-      "then": {
-        "required": [
-          "name",
-          "type",
-          "duration"
-        ]
-      },
-      "else": {
-        "oneOf": [
-          {
-            "required": [
-              "name",
-              "type",
-              "duration",
-              "end"
-            ]
-          },
-          {
-            "required": [
-              "name",
-              "type",
-              "duration",
-              "transition"
-            ]
-          }
-        ]
-      }
-    },
-    "eventstate": {
-      "type": "object",
-      "description": "This state is used to wait for events from event sources, then consumes them and invoke one or more actions to run in sequence or parallel",
-      "properties": {
-        "id": {
-          "type": "string",
-          "description": "Unique State id",
-          "minLength": 1
-        },
-        "name": {
-          "type": "string",
-          "description": "State name"
-        },
-        "type": {
-          "type": "string",
-          "const": "event",
-          "description": "State type"
-        },
-        "exclusive": {
-          "type": "boolean",
-          "default": true,
-          "description": "If true consuming one of the defined events causes its associated actions to be performed. If false all of the defined events must be consumed in order for actions to be performed"
-        },
-        "onEvents": {
-          "type": "array",
-          "description": "Define the events to be consumed and optional actions to be performed",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/onevents"
-          },
-          "additionalItems": false
-        },
-        "timeouts": {
-          "type": "object",
-          "description": "State specific timeouts",
-          "properties": {
-            "stateExecTimeout": {
-              "$ref": "timeouts.json#/definitions/stateExecTimeout"
-            },
-            "actionExecTimeout": {
-              "$ref": "timeouts.json#/definitions/actionExecTimeout"
-            },
-            "eventTimeout": {
-              "$ref": "timeouts.json#/definitions/eventTimeout"
-            }
-          },
-          "required": []
-        },
-        "stateDataFilter": {
-          "description": "State data filter",
-          "$ref": "#/definitions/statedatafilter"
-        },
-        "onErrors": {
-          "type": "array",
-          "description": "States error handling definitions",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/error"
-          },
-          "additionalItems": false
-        },
-        "transition": {
-          "description": "Next transition of the workflow after all the actions have been performed",
-          "$ref": "#/definitions/transition"
-        },
-        "end": {
-          "$ref": "#/definitions/end",
-          "description": "State end definition"
-        },
-        "compensatedBy": {
-          "type": "string",
-          "minLength": 1,
-          "description": "Unique Name of a workflow state which is responsible for compensation of this state"
-        },
-        "metadata": {
-          "$ref": "common.json#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "oneOf": [
-        {
-          "required": [
-            "name",
-            "type",
-            "onEvents",
-            "end"
-          ]
-        },
-        {
-          "required": [
-            "name",
-            "type",
-            "onEvents",
-            "transition"
-          ]
-        }
-      ]
-    },
-    "operationstate": {
-      "type": "object",
-      "description": "Defines actions be performed. Does not wait for incoming events",
-      "properties": {
-        "id": {
-          "type": "string",
-          "description": "Unique State id",
-          "minLength": 1
-        },
-        "name": {
-          "type": "string",
-          "description": "State name"
-        },
-        "type": {
-          "type": "string",
-          "const": "operation",
-          "description": "State type"
-        },
-        "end": {
-          "$ref": "#/definitions/end",
-          "description": "State end definition"
-        },
-        "stateDataFilter": {
-          "description": "State data filter",
-          "$ref": "#/definitions/statedatafilter"
-        },
-        "actionMode": {
-          "type": "string",
-          "enum": [
-            "sequential",
-            "parallel"
-          ],
-          "description": "Specifies whether actions are performed in sequence or in parallel",
-          "default": "sequential"
-        },
-        "actions": {
-          "type": "array",
-          "description": "Actions to be performed",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/action"
-          }
-        },
-        "timeouts": {
-          "type": "object",
-          "description": "State specific timeouts",
-          "properties": {
-            "stateExecTimeout": {
-              "$ref": "timeouts.json#/definitions/stateExecTimeout"
-            },
-            "actionExecTimeout": {
-              "$ref": "timeouts.json#/definitions/actionExecTimeout"
-            }
-          },
-          "required": []
-        },
-        "onErrors": {
-          "type": "array",
-          "description": "States error handling definitions",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/error"
-          },
-          "additionalItems": false
-        },
-        "transition": {
-          "description": "Next transition of the workflow after all the actions have been performed",
-          "$ref": "#/definitions/transition"
-        },
-        "compensatedBy": {
-          "type": "string",
-          "minLength": 1,
-          "description": "Unique Name of a workflow state which is responsible for compensation of this state"
-        },
-        "usedForCompensation": {
-          "type": "boolean",
-          "default": false,
-          "description": "If true, this state is used to compensate another state. Default is false"
-        },
-        "metadata": {
-          "$ref": "common.json#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "if": {
-        "properties": {
-          "usedForCompensation": {
-            "const": true
-          }
-        },
-        "required": [
-          "usedForCompensation"
-        ]
-      },
-      "then": {
-        "required": [
-          "name",
-          "type",
-          "actions"
-        ]
-      },
-      "else": {
-        "oneOf": [
-          {
-            "required": [
-              "name",
-              "type",
-              "actions",
-              "end"
-            ]
-          },
-          {
-            "required": [
-              "name",
-              "type",
-              "actions",
-              "transition"
-            ]
-          }
-        ]
-      }
-    },
-    "parallelstate": {
-      "type": "object",
-      "description": "Consists of a number of states that are executed in parallel",
-      "properties": {
-        "id": {
-          "type": "string",
-          "description": "Unique State id",
-          "minLength": 1
-        },
-        "name": {
-          "type": "string",
-          "description": "State name"
-        },
-        "type": {
-          "type": "string",
-          "const": "parallel",
-          "description": "State type"
-        },
-        "end": {
-          "$ref": "#/definitions/end",
-          "description": "State end definition"
-        },
-        "stateDataFilter": {
-          "description": "State data filter",
-          "$ref": "#/definitions/statedatafilter"
-        },
-        "timeouts": {
-          "type": "object",
-          "description": "State specific timeouts",
-          "properties": {
-            "stateExecTimeout": {
-              "$ref": "timeouts.json#/definitions/stateExecTimeout"
-            },
-            "branchExecTimeout": {
-              "$ref": "timeouts.json#/definitions/branchExecTimeout"
-            }
-          },
-          "required": []
-        },
-        "branches": {
-          "type": "array",
-          "description": "Branch Definitions",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/branch"
-          },
-          "additionalItems": false
-        },
-        "completionType": {
-          "type": "string",
-          "enum": [
-            "allOf",
-            "atLeast"
-          ],
-          "description": "Option types on how to complete branch execution.",
-          "default": "allOf"
-        },
-        "numCompleted": {
-          "type": [
-            "number",
-            "string"
-          ],
-          "minimum": 0,
-          "minLength": 0,
-          "description": "Used when completionType is set to 'atLeast' to specify the minimum number of branches that must complete before the state will transition."
-        },
-        "onErrors": {
-          "type": "array",
-          "description": "States error handling definitions",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/error"
-          },
-          "additionalItems": false
-        },
-        "transition": {
-          "description": "Next transition of the workflow after all branches have completed execution",
-          "$ref": "#/definitions/transition"
-        },
-        "compensatedBy": {
-          "type": "string",
-          "minLength": 1,
-          "description": "Unique Name of a workflow state which is responsible for compensation of this state"
-        },
-        "usedForCompensation": {
-          "type": "boolean",
-          "default": false,
-          "description": "If true, this state is used to compensate another state. Default is false"
-        },
-        "metadata": {
-          "$ref": "common.json#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "if": {
-        "properties": {
-          "usedForCompensation": {
-            "const": true
-          }
-        },
-        "required": [
-          "usedForCompensation"
-        ]
-      },
-      "then": {
-        "required": [
-          "name",
-          "type",
-          "branches"
-        ]
-      },
-      "else": {
-        "oneOf": [
-          {
-            "required": [
-              "name",
-              "type",
-              "branches",
-              "end"
-            ]
-          },
-          {
-            "required": [
-              "name",
-              "type",
-              "branches",
-              "transition"
-            ]
-          }
-        ]
-      }
-    },
-    "switchstate": {
-      "oneOf": [
-        {
-          "$ref": "#/definitions/databasedswitch"
-        },
-        {
-          "$ref": "#/definitions/eventbasedswitch"
-        }
-      ]
-    },
-    "eventbasedswitch": {
-      "type": "object",
-      "description": "Permits transitions to other states based on events",
-      "properties": {
-        "id": {
-          "type": "string",
-          "description": "Unique State id",
-          "minLength": 1
-        },
-        "name": {
-          "type": "string",
-          "description": "State name"
-        },
-        "type": {
-          "type": "string",
-          "const": "switch",
-          "description": "State type"
-        },
-        "stateDataFilter": {
-          "description": "State data filter",
-          "$ref": "#/definitions/statedatafilter"
-        },
-        "timeouts": {
-          "type": "object",
-          "description": "State specific timeouts",
-          "properties": {
-            "stateExecTimeout": {
-              "$ref": "timeouts.json#/definitions/stateExecTimeout"
-            },
-            "eventTimeout": {
-              "$ref": "timeouts.json#/definitions/eventTimeout"
-            }
-          },
-          "required": []
-        },
-        "eventConditions": {
-          "type": "array",
-          "description": "Defines conditions evaluated against events",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/eventcondition"
-          },
-          "additionalItems": false
-        },
-        "onErrors": {
-          "type": "array",
-          "description": "States error handling definitions",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/error"
-          },
-          "additionalItems": false
-        },
-        "defaultCondition": {
-          "description": "Default transition of the workflow if there is no matching data conditions. Can include a transition or end definition",
-          "$ref": "#/definitions/defaultconditiondef"
-        },
-        "compensatedBy": {
-          "type": "string",
-          "minLength": 1,
-          "description": "Unique Name of a workflow state which is responsible for compensation of this state"
-        },
-        "usedForCompensation": {
-          "type": "boolean",
-          "default": false,
-          "description": "If true, this state is used to compensate another state. Default is false"
-        },
-        "metadata": {
-          "$ref": "common.json#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "name",
-        "type",
-        "eventConditions"
-      ]
-    },
-    "databasedswitch": {
-      "type": "object",
-      "description": "Permits transitions to other states based on data conditions",
-      "properties": {
-        "id": {
-          "type": "string",
-          "description": "Unique State id",
-          "minLength": 1
-        },
-        "name": {
-          "type": "string",
-          "description": "State name"
-        },
-        "type": {
-          "type": "string",
-          "const": "switch",
-          "description": "State type"
-        },
-        "stateDataFilter": {
-          "description": "State data filter",
-          "$ref": "#/definitions/statedatafilter"
-        },
-        "timeouts": {
-          "type": "object",
-          "description": "State specific timeouts",
-          "properties": {
-            "stateExecTimeout": {
-              "$ref": "timeouts.json#/definitions/stateExecTimeout"
-            }
-          },
-          "required": []
-        },
-        "dataConditions": {
-          "type": "array",
-          "description": "Defines conditions evaluated against state data",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/datacondition"
-          },
-          "additionalItems": false
-        },
-        "onErrors": {
-          "type": "array",
-          "description": "States error handling definitions",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/error"
-          },
-          "additionalItems": false
-        },
-        "defaultCondition": {
-          "description": "Default transition of the workflow if there is no matching data conditions. Can include a transition or end definition",
-          "$ref": "#/definitions/defaultconditiondef"
-        },
-        "compensatedBy": {
-          "type": "string",
-          "minLength": 1,
-          "description": "Unique Name of a workflow state which is responsible for compensation of this state"
-        },
-        "usedForCompensation": {
-          "type": "boolean",
-          "default": false,
-          "description": "If true, this state is used to compensate another state. Default is false"
-        },
-        "metadata": {
-          "$ref": "common.json#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "name",
-        "type",
-        "dataConditions"
-      ]
-    },
-    "defaultconditiondef": {
-      "type": "object",
-      "description": "DefaultCondition definition. Can be either a transition or end definition",
-      "properties": {
-        "transition": {
-          "$ref": "#/definitions/transition"
-        },
-        "end": {
-          "$ref": "#/definitions/end"
-        }
-      },
-      "additionalProperties": false,
-      "oneOf": [
-        {
-          "required": [
-            "transition"
-          ]
-        },
-        {
-          "required": [
-            "end"
-          ]
-        }
-      ]
-    },
-    "eventcondition": {
-      "oneOf": [
-        {
-          "$ref": "#/definitions/transitioneventcondition"
-        },
-        {
-          "$ref": "#/definitions/enddeventcondition"
-        }
-      ]
-    },
-    "transitioneventcondition": {
-      "type": "object",
-      "description": "Switch state data event condition",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Event condition name"
-        },
-        "eventRef": {
-          "type": "string",
-          "description": "References an unique event name in the defined workflow events"
-        },
-        "transition": {
-          "description": "Next transition of the workflow if there is valid matches",
-          "$ref": "#/definitions/transition"
-        },
-        "eventDataFilter": {
-          "description": "Event data filter definition",
-          "$ref": "#/definitions/eventdatafilter"
-        },
-        "metadata": {
-          "$ref": "common.json#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "eventRef",
-        "transition"
-      ]
-    },
-    "enddeventcondition": {
-      "type": "object",
-      "description": "Switch state data event condition",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Event condition name"
-        },
-        "eventRef": {
-          "type": "string",
-          "description": "References an unique event name in the defined workflow events"
-        },
-        "end": {
-          "$ref": "#/definitions/end",
-          "description": "Explicit transition to end"
-        },
-        "eventDataFilter": {
-          "description": "Event data filter definition",
-          "$ref": "#/definitions/eventdatafilter"
-        },
-        "metadata": {
-          "$ref": "common.json#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "eventRef",
-        "end"
-      ]
-    },
-    "datacondition": {
-      "oneOf": [
-        {
-          "$ref": "#/definitions/transitiondatacondition"
-        },
-        {
-          "$ref": "#/definitions/enddatacondition"
-        }
-      ]
-    },
-    "transitiondatacondition": {
-      "type": "object",
-      "description": "Switch state data based condition",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Data condition name"
-        },
-        "condition": {
-          "type": "string",
-          "description": "Workflow expression evaluated against state data. Must evaluate to true or false"
-        },
-        "transition": {
-          "description": "Workflow transition if condition is evaluated to true",
-          "$ref": "#/definitions/transition"
-        },
-        "metadata": {
-          "$ref": "common.json#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "condition",
-        "transition"
-      ]
-    },
-    "enddatacondition": {
-      "type": "object",
-      "description": "Switch state data based condition",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "Data condition name"
-        },
-        "condition": {
-          "type": "string",
-          "description": "Workflow expression evaluated against state data. Must evaluate to true or false"
-        },
-        "end": {
-          "$ref": "#/definitions/end",
-          "description": "Workflow end definition"
-        },
-        "metadata": {
-          "$ref": "common.json#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "condition",
-        "end"
-      ]
-    },
-    "injectstate": {
-      "type": "object",
-      "description": "Inject static data into state data. Does not perform any actions",
-      "properties": {
-        "id": {
-          "type": "string",
-          "description": "Unique state id",
-          "minLength": 1
-        },
-        "name": {
-          "type": "string",
-          "description": "State name"
-        },
-        "type": {
-          "type": "string",
-          "const": "inject",
-          "description": "State type"
-        },
-        "end": {
-          "$ref": "#/definitions/end",
-          "description": "State end definition"
-        },
-        "data": {
-          "type": "object",
-          "description": "JSON object which can be set as states data input and can be manipulated via filters"
-        },
-        "timeouts": {
-          "type": "object",
-          "description": "State specific timeouts",
-          "properties": {
-            "stateExecTimeout": {
-              "$ref": "timeouts.json#/definitions/stateExecTimeout"
-            }
-          },
-          "required": []
-        },
-        "stateDataFilter": {
-          "description": "State data filter",
-          "$ref": "#/definitions/statedatafilter"
-        },
-        "transition": {
-          "description": "Next transition of the workflow after injection has completed",
-          "$ref": "#/definitions/transition"
-        },
-        "compensatedBy": {
-          "type": "string",
-          "minLength": 1,
-          "description": "Unique Name of a workflow state which is responsible for compensation of this state"
-        },
-        "usedForCompensation": {
-          "type": "boolean",
-          "default": false,
-          "description": "If true, this state is used to compensate another state. Default is false"
-        },
-        "metadata": {
-          "$ref": "common.json#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "if": {
-        "properties": {
-          "usedForCompensation": {
-            "const": true
-          }
-        },
-        "required": [
-          "usedForCompensation"
-        ]
-      },
-      "then": {
-        "required": [
-          "name",
-          "type",
-          "data"
-        ]
-      },
-      "else": {
-        "oneOf": [
-          {
-            "required": [
-              "name",
-              "type",
-              "data",
-              "end"
-            ]
-          },
-          {
-            "required": [
-              "name",
-              "type",
-              "data",
-              "transition"
-            ]
-          }
-        ]
-      }
-    },
-    "foreachstate": {
-      "type": "object",
-      "description": "Execute a set of defined actions or workflows for each element of a data array",
-      "properties": {
-        "id": {
-          "type": "string",
-          "description": "Unique State id",
-          "minLength": 1
-        },
-        "name": {
-          "type": "string",
-          "description": "State name"
-        },
-        "type": {
-          "type": "string",
-          "const": "foreach",
-          "description": "State type"
-        },
-        "end": {
-          "$ref": "#/definitions/end",
-          "description": "State end definition"
-        },
-        "inputCollection": {
-          "type": "string",
-          "description": "Workflow expression selecting an array element of the states data"
-        },
-        "outputCollection": {
-          "type": "string",
-          "description": "Workflow expression specifying an array element of the states data to add the results of each iteration"
-        },
-        "iterationParam": {
-          "type": "string",
-          "description": "Name of the iteration parameter that can be referenced in actions/workflow. For each parallel iteration, this param should contain an unique element of the inputCollection array"
-        },
-        "batchSize": {
-          "type": [
-            "number",
-            "string"
-          ],
-          "minimum": 0,
-          "minLength": 0,
-          "description": "Specifies how many iterations may run in parallel at the same time. Used if 'mode' property is set to 'parallel' (default)"
-        },
-        "actions": {
-          "type": "array",
-          "description": "Actions to be executed for each of the elements of inputCollection",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/action"
-          },
-          "additionalItems": false
-        },
-        "timeouts": {
-          "type": "object",
-          "description": "State specific timeouts",
-          "properties": {
-            "stateExecTimeout": {
-              "$ref": "timeouts.json#/definitions/stateExecTimeout"
-            },
-            "actionExecTimeout": {
-              "$ref": "timeouts.json#/definitions/actionExecTimeout"
-            }
-          },
-          "required": []
-        },
-        "stateDataFilter": {
-          "description": "State data filter",
-          "$ref": "#/definitions/statedatafilter"
-        },
-        "onErrors": {
-          "type": "array",
-          "description": "States error handling definitions",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/error"
-          },
-          "additionalItems": false
-        },
-        "transition": {
-          "description": "Next transition of the workflow after state has completed",
-          "$ref": "#/definitions/transition"
-        },
-        "compensatedBy": {
-          "type": "string",
-          "minLength": 1,
-          "description": "Unique Name of a workflow state which is responsible for compensation of this state"
-        },
-        "usedForCompensation": {
-          "type": "boolean",
-          "default": false,
-          "description": "If true, this state is used to compensate another state. Default is false"
-        },
-        "mode": {
-          "type": "string",
-          "enum": [
-            "sequential",
-            "parallel"
-          ],
-          "description": "Specifies how iterations are to be performed (sequentially or in parallel)",
-          "default": "parallel"
-        },
-        "metadata": {
-          "$ref": "common.json#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "if": {
-        "properties": {
-          "usedForCompensation": {
-            "const": true
-          }
-        },
-        "required": [
-          "usedForCompensation"
-        ]
-      },
-      "then": {
-        "required": [
-          "name",
-          "type",
-          "inputCollection",
-          "iterationParam",
-          "actions"
-        ]
-      },
-      "else": {
-        "oneOf": [
-          {
-            "required": [
-              "name",
-              "type",
-              "inputCollection",
-              "iterationParam",
-              "actions",
-              "end"
-            ]
-          },
-          {
-            "required": [
-              "name",
-              "type",
-              "inputCollection",
-              "iterationParam",
-              "actions",
-              "transition"
-            ]
-          }
-        ]
-      }
-    },
-    "callbackstate": {
-      "type": "object",
-      "description": "This state performs an action, then waits for the callback event that denotes completion of the action",
-      "properties": {
-        "id": {
-          "type": "string",
-          "description": "Unique state id",
-          "minLength": 1
-        },
-        "name": {
-          "type": "string",
-          "description": "State name"
-        },
-        "type": {
-          "type": "string",
-          "const": "callback",
-          "description": "State type"
-        },
-        "action": {
-          "description": "Defines the action to be executed",
-          "$ref": "#/definitions/action"
-        },
-        "eventRef": {
-          "type": "string",
-          "description": "References an unique callback event name in the defined workflow events"
-        },
-        "timeouts": {
-          "type": "object",
-          "description": "State specific timeouts",
-          "properties": {
-            "stateExecTimeout": {
-              "$ref": "timeouts.json#/definitions/stateExecTimeout"
-            },
-            "actionExecTimeout": {
-              "$ref": "timeouts.json#/definitions/actionExecTimeout"
-            },
-            "eventTimeout": {
-              "$ref": "timeouts.json#/definitions/eventTimeout"
-            }
-          },
-          "required": []
-        },
-        "eventDataFilter": {
-          "description": "Event data filter",
-          "$ref": "#/definitions/eventdatafilter"
-        },
-        "stateDataFilter": {
-          "description": "State data filter",
-          "$ref": "#/definitions/statedatafilter"
-        },
-        "onErrors": {
-          "type": "array",
-          "description": "States error handling definitions",
-          "items": {
-            "type": "object",
-            "$ref": "#/definitions/error"
-          },
-          "additionalItems": false
-        },
-        "transition": {
-          "description": "Next transition of the workflow after all the actions have been performed",
-          "$ref": "#/definitions/transition"
-        },
-        "end": {
-          "$ref": "#/definitions/end",
-          "description": "State end definition"
-        },
-        "compensatedBy": {
-          "type": "string",
-          "minLength": 1,
-          "description": "Unique Name of a workflow state which is responsible for compensation of this state"
-        },
-        "usedForCompensation": {
-          "type": "boolean",
-          "default": false,
-          "description": "If true, this state is used to compensate another state. Default is false"
-        },
-        "metadata": {
-          "$ref": "common.json#/definitions/metadata"
-        }
-      },
-      "additionalProperties": false,
-      "if": {
-        "properties": {
-          "usedForCompensation": {
-            "const": true
-          }
-        },
-        "required": [
-          "usedForCompensation"
-        ]
-      },
-      "then": {
-        "required": [
-          "name",
-          "type",
-          "action",
-          "eventRef"
-        ]
-      },
-      "else": {
-        "oneOf": [
-          {
-            "required": [
-              "name",
-              "type",
-              "action",
-              "eventRef",
-              "end"
-            ]
-          },
-          {
-            "required": [
-              "name",
-              "type",
-              "action",
-              "eventRef",
-              "transition"
-            ]
-          }
-        ]
-      }
-    },
-    "startdef": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Name of the starting workflow state",
-          "minLength": 1
-        },
-        {
-          "type": "object",
-          "description": "Workflow start definition",
-          "properties": {
-            "stateName": {
-              "type": "string",
-              "description": "Name of the starting workflow state",
-              "minLength": 1
-            },
-            "schedule": {
-              "description": "Define the time/repeating intervals or cron at which workflow instances should be automatically started.",
-              "$ref": "#/definitions/schedule"
-            }
-          },
-          "additionalProperties": false,
-          "required": [
-            "stateName",
-            "schedule"
-          ]
-        }
-      ]
-    },
-    "schedule": {
-      "oneOf": [
-        {
-          "type": "string",
-          "description": "Time interval (must be repeating interval) described with ISO 8601 format. Declares when workflow instances will be automatically created.  (UTC timezone is assumed)",
-          "minLength": 1
-        },
-        {
-          "type": "object",
-          "description": "Start state schedule definition",
-          "properties": {
-            "interval": {
-              "type": "string",
-              "description": "Time interval (must be repeating interval) described with ISO 8601 format. Declares when workflow instances will be automatically created.",
-              "minLength": 1
-            },
-            "cron": {
-              "$ref": "#/definitions/crondef"
-            },
-            "timezone": {
-              "type": "string",
-              "description": "Timezone name used to evaluate the interval & cron-expression. (default: UTC)"
-            }
-          },
-          "additionalProperties": false,
-          "oneOf": [
-            {
-              "required": [
-                "interval"
-              ]
-            },
-            {
-              "required": [
-                "cron"
-              ]
-            }
-          ]
-        }
-      ]
-    },
-    "end": {
-      "oneOf": [
-        {
-          "type": "boolean",
-          "description": "State end definition",
-          "default": true
-        },
-        {
-          "type": "object",
-          "description": "State end definition",
-          "properties": {
-            "terminate": {
-              "type": "boolean",
-              "default": false,
-              "description": "If true, completes all execution flows in the given workflow instance"
-            },
-            "produceEvents": {
-              "type": "array",
-              "description": "Defines events that should be produced",
-              "items": {
-                "type": "object",
-                "$ref": "#/definitions/produceeventdef"
-              },
-              "additionalItems": false
-            },
-            "compensate": {
-              "type": "boolean",
-              "default": false,
-              "description": "If set to true, triggers workflow compensation. Default is false"
-            },
-            "continueAs": {
-              "$ref": "#/definitions/continueasdef"
-            }
-          },
-          "additionalProperties": false,
-          "required": []
-        }
-      ]
-    },
-    "produceeventdef": {
-      "type": "object",
-      "description": "Produce an event and set its data",
-      "properties": {
-        "eventRef": {
-          "type": "string",
-          "description": "References a name of a defined event"
-        },
-        "data": {
-          "type": [
-            "string",
-            "object"
-          ],
-          "description": "If String, expression which selects parts of the states data output to become the data of the produced event. If object a custom object to become the data of produced event."
-        },
-        "contextAttributes": {
-          "type": "object",
-          "description": "Add additional event extension context attributes",
-          "additionalProperties": {
-            "type": "string"
-          }
-        }
-      },
-      "additionalProperties": false,
-      "required": [
-        "eventRef"
-      ]
-    },
-    "statedatafilter": {
-      "type": "object",
-      "properties": {
-        "input": {
-          "type": "string",
-          "description": "Workflow expression to filter the state data input"
-        },
-        "output": {
-          "type": "string",
-          "description": "Workflow expression that filters the state data output"
-        }
-      },
-      "additionalProperties": false,
-      "required": []
-    },
-    "eventdatafilter": {
-      "type": "object",
-      "properties": {
-        "data": {
-          "type": "string",
-          "description": "Workflow expression that filters the received event/payload (default: '${ . }')"
-        },
-        "toStateData": {
-          "type": "string",
-          "description": " Workflow expression that selects a state data element to which the filtered event should be added/merged into. If not specified, denotes, the top-level state data element."
-        }
-      },
-      "additionalProperties": false,
-      "required": []
-    },
-    "actiondatafilter": {
-      "type": "object",
-      "properties": {
-        "fromStateData": {
-          "type": "string",
-          "description": "Workflow expression that selects state data that the state action can use"
-        },
-        "results": {
-          "type": "string",
-          "description": "Workflow expression that filters the actions data results"
-        },
-        "toStateData": {
-          "type": "string",
-          "description": "Workflow expression that selects a state data element to which the action results should be added/merged into. If not specified, denote, the top-level state data element"
-        }
-      },
-      "additionalProperties": false,
-      "required": []
-    }
-  }
-}
\ No newline at end of file
diff --git a/src/lib/utils.ts b/src/lib/utils.ts
index 90bcdfe7..62d6fea5 100644
--- a/src/lib/utils.ts
+++ b/src/lib/utils.ts
@@ -9,44 +9,32 @@
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * oUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
+ *
  */
-import { DefinedError, ValidateFunction } from 'ajv';
-import { validators } from './validators';
 
 /**
- * Validates the provided data or throws an error
- * @param typeName {string} The data type to validate
- * @param data {object} The data to validate
- * @returns {boolean} True if valid, throws if invalid
+ * Check if the provided value is an object but not an array
+ * @param value The value to check
+ * @returns True if the value is an object
  */
-export const validate = (typeName: string, data: any): boolean => {
-  const validateFn: ValidateFunction | undefined = validators.get(typeName);
-
-  if (!validateFn) {
-    throw Error(`Validate function not defined for type '${typeName}'`);
-  }
-
-  if (!validateFn(JSON.parse(JSON.stringify(data)))) {
-    console.warn(validateFn.errors);
-    const firstError: DefinedError = (validateFn.errors as DefinedError[])[0];
-    throw new Error(
-      `${typeName} is invalid: ${firstError.instancePath} | ${firstError.schemaPath} | ${firstError.message}
-      data: ${JSON.stringify(data, null, 4)}`
-    );
-  }
-  return true;
+export const isObject = (value: T): value is T & object => {
+  if (!value) return false;
+  return typeof value === 'object' && !Array.isArray(value);
 };
 
 /**
- * Determine if the provided value is an object or a primitive type
- * @param value The data
- * @returns {boolean} True if the provided value is an object
+ * Makes a deep copy of the provided object
+ * @param obj
+ * @returns
  */
-export const isObject = (value: any): boolean => {
-  if (!value) return false;
-  const type = typeof value;
-  return type === 'object';
-};
+export const deepCopy = (obj: T): T => JSON.parse(JSON.stringify(obj));
+
+/**
+ * Checks the provided array is an array
+ * @param arr
+ * @returns
+ */
+export const isArray = (arr: Array | number | undefined): arr is Array => !!arr && isNaN(arr as number);
diff --git a/src/lib/validation-error.ts b/src/lib/validation-error.ts
deleted file mode 100644
index 687aa3b7..00000000
--- a/src/lib/validation-error.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { DefinedError } from 'ajv';
-
-export class ValidationError {
-  readonly message: string;
-
-  constructor(readonly error: DefinedError) {
-    this.message = `invalid: ${error.instancePath} | ${error.schemaPath} | ${error.message}`;
-  }
-}
diff --git a/src/lib/validation.ts b/src/lib/validation.ts
new file mode 100644
index 00000000..920d5d2a
--- /dev/null
+++ b/src/lib/validation.ts
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * oUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import Ajv, { ValidateFunction } from 'ajv/dist/2020';
+import addFormats from 'ajv-formats';
+import workflowSchema from './generated/schema/workflow.json';
+import { validationPointers } from './generated/validation';
+import { deepCopy } from './utils';
+import { getLifecycleHooks } from './lifecycle-hooks';
+import { Specification } from './generated/definitions';
+
+const ajv = new Ajv({
+  schemas: [workflowSchema],
+  strict: false,
+});
+addFormats(ajv);
+
+/**
+ * A Map of validation functions, where the key is the name of the schema to validate with
+ */
+const validators: Map = new Map(
+  Object.entries(validationPointers).map(([typeName, jsonPointer]) => {
+    if (!jsonPointer) throw `No JSON pointer provided for type '${typeName}'`;
+    const validate = ajv.getSchema(jsonPointer);
+    if (!validate) throw `Unable to find schema '${jsonPointer}' for type '${typeName}'`;
+    return [typeName, validate as ValidateFunction];
+  }),
+);
+
+/**
+ * Validates the provided data or throws an error
+ * @param typeName The data type to validate
+ * @param data The data to validate
+ * @param workflow A workflow instance, used for DSL level validation
+ * @returns Throws if invalid
+ */
+export const validate = (typeName: string, data: T, workflow?: Partial) => {
+  getLifecycleHooks(typeName)?.preValidation?.(data, workflow);
+  const validateFn: ValidateFunction | undefined = validators.get(typeName);
+  if (!validateFn) {
+    throw Error(`Unable to find a validation function for '${typeName}'`);
+  }
+  // prevents possible data mutation and invalid "additional properties" from the classes like constructor/validate/normalize
+  if (!validateFn(deepCopy(data))) {
+    throw new Error(
+      `'${typeName}' is invalid:
+${validateFn.errors?.reduce((acc, error) => acc + `- ${error.instancePath} | ${error.schemaPath} | ${error.message} | ${JSON.stringify(error.params)}\n`, '') ?? ''}
+
+data: ${JSON.stringify(data, null, 4)}`,
+    );
+  }
+  getLifecycleHooks(typeName)?.postValidation?.(data, workflow);
+};
diff --git a/src/lib/validation/validators-paths.ts b/src/lib/validation/validators-paths.ts
deleted file mode 100644
index e3b0cf4e..00000000
--- a/src/lib/validation/validators-paths.ts
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * A map of type names and their corresponding schema
- */
-export const validatorsPaths: [string, string][] = [
-  ['Workflow', 'https://serverlessworkflow.io/schemas/0.7/workflow.json'],
-  ['Sleep', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/sleep'],
-  ['Crondef', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/crondef'],
-  ['Continueasdef', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/continueasdef'],
-  ['Transition', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/transition'],
-  ['Error', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/error'],
-  ['Onevents', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/onevents'],
-  ['Action', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/action'],
-  ['Functionref', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/functionref'],
-  ['Eventref', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/eventref'],
-  ['Subflowref', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/subflowref'],
-  ['Branch', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/branch'],
-  ['Sleepstate', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/sleepstate'],
-  ['Eventstate', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/eventstate'],
-  ['Operationstate', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/operationstate'],
-  ['Parallelstate', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/parallelstate'],
-  ['Switchstate', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/switchstate'],
-  ['Eventbasedswitch', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/eventbasedswitch'],
-  ['Databasedswitch', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/databasedswitch'],
-  ['Defaultconditiondef', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/defaultconditiondef'],
-  ['Eventcondition', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/eventcondition'],
-  [
-    'Transitioneventcondition',
-    'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/transitioneventcondition',
-  ],
-  ['Enddeventcondition', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/enddeventcondition'],
-  ['Datacondition', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/datacondition'],
-  [
-    'Transitiondatacondition',
-    'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/transitiondatacondition',
-  ],
-  ['Enddatacondition', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/enddatacondition'],
-  ['Injectstate', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/injectstate'],
-  ['Foreachstate', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/foreachstate'],
-  ['Callbackstate', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/callbackstate'],
-  ['Startdef', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/startdef'],
-  ['Schedule', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/schedule'],
-  ['End', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/end'],
-  ['Produceeventdef', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/produceeventdef'],
-  ['Statedatafilter', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/statedatafilter'],
-  ['Eventdatafilter', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/eventdatafilter'],
-  ['Actiondatafilter', 'https://serverlessworkflow.io/schemas/0.7/workflow.json#/definitions/actiondatafilter'],
-  ['Metadata', 'https://serverlessworkflow.io/schemas/0.7/common.json#/definitions/metadata'],
-  ['WorkflowExecTimeout', 'https://serverlessworkflow.io/schemas/0.7/timeouts.json#/definitions/workflowExecTimeout'],
-  ['StateExecTimeout', 'https://serverlessworkflow.io/schemas/0.7/timeouts.json#/definitions/stateExecTimeout'],
-  ['ActionExecTimeout', 'https://serverlessworkflow.io/schemas/0.7/timeouts.json#/definitions/actionExecTimeout'],
-  ['BranchExecTimeout', 'https://serverlessworkflow.io/schemas/0.7/timeouts.json#/definitions/branchExecTimeout'],
-  ['EventTimeout', 'https://serverlessworkflow.io/schemas/0.7/timeouts.json#/definitions/eventTimeout'],
-  ['Retrydef', 'https://serverlessworkflow.io/schemas/0.7/retries.json#/definitions/retrydef'],
-  ['Function', 'https://serverlessworkflow.io/schemas/0.7/functions.json#/definitions/function'],
-  ['Errordef', 'https://serverlessworkflow.io/schemas/0.7/errors.json#/definitions/errordef'],
-  ['Eventdef', 'https://serverlessworkflow.io/schemas/0.7/events.json#/definitions/eventdef'],
-  ['CorrelationDef', 'https://serverlessworkflow.io/schemas/0.7/events.json#/definitions/correlationDef'],
-  ['Authdef', 'https://serverlessworkflow.io/schemas/0.7/auth.json#/definitions/authdef'],
-  ['Basicpropsdef', 'https://serverlessworkflow.io/schemas/0.7/auth.json#/definitions/basicpropsdef'],
-  ['Bearerpropsdef', 'https://serverlessworkflow.io/schemas/0.7/auth.json#/definitions/bearerpropsdef'],
-  ['Oauth2propsdef', 'https://serverlessworkflow.io/schemas/0.7/auth.json#/definitions/oauth2propsdef'],
-  ['Secrets', 'https://serverlessworkflow.io/schemas/0.7/secrets.json#/secrets'],
-  ['Timeouts', 'https://serverlessworkflow.io/schemas/0.7/timeouts.json#/timeouts'],
-  ['Errors', 'https://serverlessworkflow.io/schemas/0.7/errors.json#/errors'],
-  ['Events', 'https://serverlessworkflow.io/schemas/0.7/events.json#/events'],
-  ['Functions', 'https://serverlessworkflow.io/schemas/0.7/functions.json#/functions'],
-  ['Retries', 'https://serverlessworkflow.io/schemas/0.7/retries.json#/retries'],
-  ['Auth', 'https://serverlessworkflow.io/schemas/0.7/auth.json#/auth'],
-];
diff --git a/src/lib/validators.ts b/src/lib/validators.ts
deleted file mode 100644
index 761acb6f..00000000
--- a/src/lib/validators.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import Ajv, { ValidateFunction } from 'ajv';
-import authSchema from './schema/auth.json';
-import commonSchema from './schema/common.json';
-import errorsSchema from './schema/errors.json';
-import eventsSchema from './schema/events.json';
-import functionsSchema from './schema/functions.json';
-import retriesSchema from './schema/retries.json';
-import secretsSchema from './schema/secrets.json';
-import timeoutsSchema from './schema/timeouts.json';
-import workflowSchema from './schema/workflow.json';
-import { validatorsPaths } from './validation/validators-paths';
-
-const schemas: any[] = [
-  authSchema,
-  commonSchema,
-  eventsSchema,
-  errorsSchema,
-  functionsSchema,
-  retriesSchema,
-  secretsSchema,
-  timeoutsSchema,
-  workflowSchema,
-];
-const strict: boolean = false;
-const ajv = new Ajv({ schemas, strict });
-ajv.addFormat('uri', (uri: string): boolean => true);
-/**
- * A Map of validation functions, where the key is the name of the schema to validate with
- */
-export const validators: Map = new Map(
-  validatorsPaths.map(([dataType, schemaPath]) => {
-    const validate = ajv.getSchema(schemaPath);
-    if (!validate) throw `Unable to find schema '${schemaPath}' for type '${dataType}'`;
-    return [dataType, validate as ValidateFunction];
-  })
-);
diff --git a/src/lib/workflow-validator.ts b/src/lib/workflow-validator.ts
deleted file mode 100644
index 37938035..00000000
--- a/src/lib/workflow-validator.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { ValidateFunction, DefinedError } from 'ajv';
-import { Specification } from './definitions';
-import { validators } from './validators';
-import { ValidationError } from './validation-error';
-
-export class WorkflowValidator {
-  /** The validation errors after running validate(), if any */
-  readonly errors: ValidationError[] | never[] = [];
-
-  /** Whether the workflow is valid or not */
-  readonly isValid: boolean;
-
-  /**
-   * Creates a new WorkflowValidator for the provided workflow
-   * @param {Workflow} workflow The workflow to validate
-   */
-  constructor(private workflow: Specification.Workflow) {
-    const validateFn = validators.get('Workflow') as ValidateFunction;
-    this.isValid = validateFn(this.workflow);
-    if (validateFn.errors) {
-      this.errors = validateFn.errors.map((error) => new ValidationError(error as DefinedError));
-    }
-  }
-}
diff --git a/src/serverless-workflow-sdk.ts b/src/serverless-workflow-sdk.ts
index 0d865f7a..746e9869 100644
--- a/src/serverless-workflow-sdk.ts
+++ b/src/serverless-workflow-sdk.ts
@@ -1,21 +1,6 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-export * from './lib/validation-error';
-export * from './lib/workflow-validator';
-export * from './lib/validators';
-export * from './lib/builders';
-export * from './lib/definitions';
+export * from './lib/generated/builders';
+export * from './lib/generated/classes';
+export * from './lib/generated/definitions';
+export * from './lib/validation';
+export * from './lib/graph-builder';
+export * from './lib/mermaid-converter';
diff --git a/tests/builders/builder.spec.ts b/tests/builders/builder.spec.ts
new file mode 100644
index 00000000..28c79ccf
--- /dev/null
+++ b/tests/builders/builder.spec.ts
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * oUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import { Builder, builder } from '../../src/lib/builder';
+import { type } from 'ts-inference-check';
+
+type Person = {
+  name: string;
+  age: number;
+  friends?: Array;
+  [k: string]: unknown;
+};
+
+const darknessMyOldFriend = { name: 'Darkness', age: 999 };
+const isPerson = (model: Partial): model is Person => !!model.name && !!model.age;
+function personBuildingFn(model: Partial): Person {
+  if (!isPerson(model)) {
+    throw new Error('The provided object is not a person');
+  }
+  return {
+    ...model,
+    friends: [...(model.friends || []), darknessMyOldFriend],
+  };
+}
+const personBuilder = (model?: Partial): Builder => builder(model, personBuildingFn);
+
+describe('builder proxy', () => {
+  it('should infer property types', () => {
+    const builder = personBuilder();
+    expect(type(builder.name).is<(arg: string) => Builder>(true)).toBe(true);
+    expect(type(builder.age).is<(arg: number) => Builder>(true)).toBe(true);
+    expect(type(builder.friends).is<(arg: Array | undefined) => Builder>(true)).toBe(true);
+    expect(type(builder.lover).is<(arg: unknown) => Builder>(true)).toBe(true);
+  });
+
+  it('should build', () => {
+    const name = 'John Doe';
+    const age = 42;
+    const friend = { name: 'Cookie Doe', age: 42 };
+    const lover = 'Jane Doe';
+    const person = personBuilder().name(name).age(age).friends([friend]).lover(lover).build();
+    expect(person).toBeDefined();
+    expect(person.name).toBe(name);
+    expect(person.age).toBe(age);
+    expect(person.friends?.length).toBe(2);
+    expect(person.friends?.includes(friend)).toBe(true);
+    expect(person.friends?.includes(darknessMyOldFriend)).toBe(true);
+    expect(person.lover).toBe(lover);
+  });
+});
diff --git a/tests/builders/call-async-api-builder.spec.ts b/tests/builders/call-async-api-builder.spec.ts
new file mode 100644
index 00000000..a8aac660
--- /dev/null
+++ b/tests/builders/call-async-api-builder.spec.ts
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * oUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import { callAsyncAPIBuilder } from '../../src/lib/generated/builders';
+import { Classes } from '../../src/lib/generated/classes';
+
+const document = { endpoint: 'https://example.com', name: 'example' };
+const operation = 'operationRef';
+const subscription = {
+  consume: {
+    until: '${ .condition }',
+  },
+};
+
+describe('CallAsyncAPI builder', () => {
+  it('should build with fluent api', () => {
+    const callAsyncAPI = callAsyncAPIBuilder()
+      .with({
+        document,
+        operation,
+        subscription,
+      })
+      .build();
+    expect(callAsyncAPI).toBeDefined();
+    expect(callAsyncAPI).toBeInstanceOf(Classes.CallAsyncAPI);
+    expect(callAsyncAPI.call).toBe('asyncapi');
+    expect(callAsyncAPI.with).toBeDefined();
+    expect(callAsyncAPI.with!.document).toEqual(document);
+    expect(callAsyncAPI.with!.operation).toBe(operation);
+    expect(callAsyncAPI.with!.subscription).toEqual(subscription);
+  });
+
+  it('should build with input', () => {
+    const data = {
+      with: {
+        document,
+        operation,
+        subscription,
+      },
+    };
+    const callAsyncAPI = callAsyncAPIBuilder(data).build();
+    expect(callAsyncAPI).toBeDefined();
+    expect(callAsyncAPI).toBeInstanceOf(Classes.CallAsyncAPI);
+    expect(callAsyncAPI.call).toBe('asyncapi');
+    expect(callAsyncAPI.with).toBeDefined();
+    expect(callAsyncAPI.with!.document).toEqual(document);
+    expect(callAsyncAPI.with!.operation).toBe(operation);
+    expect(callAsyncAPI.with!.subscription).toEqual(subscription);
+  });
+
+  it('should throw when invalid', () => {
+    const test = () => {
+      callAsyncAPIBuilder().build();
+    };
+    expect(test).toThrow(Error);
+    expect(test).toThrow(/'CallAsyncAPI' is invalid/);
+  });
+
+  it('should not throw when validation is disabled', () => {
+    const test = () => {
+      callAsyncAPIBuilder().build({ validate: false });
+    };
+    expect(test).not.toThrow();
+  });
+});
diff --git a/tests/builders/call-function-builder.spec.ts b/tests/builders/call-function-builder.spec.ts
new file mode 100644
index 00000000..3ab60ed9
--- /dev/null
+++ b/tests/builders/call-function-builder.spec.ts
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * oUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import { callFunctionBuilder } from '../../src/lib/generated/builders';
+import { Classes } from '../../src/lib/generated/classes';
+
+const functionName = 'exampleFunction';
+const functionArgs = { arg1: 'value1', arg2: 'value2' };
+
+describe('CallFunction builder', () => {
+  it('should build with fluent api', () => {
+    const callFunction = callFunctionBuilder().call(functionName).build();
+    expect(callFunction).toBeDefined();
+    expect(callFunction).toBeInstanceOf(Classes.CallFunction);
+    expect(callFunction.call).toBe(functionName);
+  });
+
+  it('should build with input', () => {
+    const data = {
+      call: functionName,
+    };
+    const callFunction = callFunctionBuilder(data).build();
+    expect(callFunction).toBeDefined();
+    expect(callFunction).toBeInstanceOf(Classes.CallFunction);
+    expect(callFunction.call).toBe(functionName);
+  });
+
+  it('should build with function arguments', () => {
+    const callFunction = callFunctionBuilder().call(functionName).with(functionArgs).build();
+    expect(callFunction).toBeDefined();
+    expect(callFunction).toBeInstanceOf(Classes.CallFunction);
+    expect(callFunction.call).toBe(functionName);
+    expect(callFunction.with).toEqual(functionArgs);
+  });
+
+  it('should build with input and function arguments', () => {
+    const data = {
+      call: functionName,
+      with: functionArgs,
+    };
+    const callFunction = callFunctionBuilder(data).build();
+    expect(callFunction).toBeDefined();
+    expect(callFunction).toBeInstanceOf(Classes.CallFunction);
+    expect(callFunction.call).toBe(functionName);
+    expect(callFunction.with).toEqual(functionArgs);
+  });
+
+  it('should throw when invalid', () => {
+    const test = () => {
+      callFunctionBuilder().build();
+    };
+    expect(test).toThrow(Error);
+    expect(test).toThrow(/'CallFunction' is invalid/);
+  });
+
+  it('should not throw when validation is disabled', () => {
+    const test = () => {
+      callFunctionBuilder().build({ validate: false });
+    };
+    expect(test).not.toThrow();
+  });
+});
diff --git a/tests/builders/call-grpc-builder.spec.ts b/tests/builders/call-grpc-builder.spec.ts
new file mode 100644
index 00000000..13deaa81
--- /dev/null
+++ b/tests/builders/call-grpc-builder.spec.ts
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * oUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import { callGRPCBuilder } from '../../src/lib/generated/builders';
+import { Classes } from '../../src/lib/generated/classes';
+
+const proto = { name: 'foo', endpoint: 'http://proto.com' };
+const service = { name: 'MyService', host: 'Host' };
+const method = 'MyMethod';
+
+describe('CallGRPC builder', () => {
+  it('should build with fluent api', () => {
+    const callGrpc = callGRPCBuilder()
+      .with({
+        proto,
+        service,
+        method,
+      })
+      .build();
+    expect(callGrpc).toBeDefined();
+    expect(callGrpc).toBeInstanceOf(Classes.CallGRPC);
+    expect(callGrpc.call).toBe('grpc');
+    expect(callGrpc.with).toBeDefined();
+    expect(callGrpc.with!.service).toEqual(service);
+    expect(callGrpc.with!.method).toBe(method);
+  });
+
+  it('should build with input', () => {
+    const data = {
+      with: {
+        proto,
+        service,
+        method,
+      },
+    };
+    const callGrpc = callGRPCBuilder(data).build();
+    expect(callGrpc).toBeDefined();
+    expect(callGrpc).toBeInstanceOf(Classes.CallGRPC);
+    expect(callGrpc.call).toBe('grpc');
+    expect(callGrpc.with).toBeDefined();
+    expect(callGrpc.with!.service).toEqual(service);
+    expect(callGrpc.with!.method).toBe(method);
+  });
+
+  it('should throw when invalid', () => {
+    const test = () => {
+      callGRPCBuilder().build();
+    };
+    expect(test).toThrow(Error);
+    expect(test).toThrow(/'CallGRPC' is invalid/);
+  });
+
+  it('should not throw when validation is disabled', () => {
+    const test = () => {
+      callGRPCBuilder().build({ validate: false });
+    };
+    expect(test).not.toThrow();
+  });
+});
diff --git a/tests/builders/call-http-builder.spec.ts b/tests/builders/call-http-builder.spec.ts
new file mode 100644
index 00000000..67fd2e54
--- /dev/null
+++ b/tests/builders/call-http-builder.spec.ts
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * oUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+import { callHTTPBuilder } from '../../src/lib/generated/builders';
+import { Classes } from '../../src/lib/generated/classes';
+
+describe('CallHTTP builder', () => {
+  it('should build with fluent api', () => {
+    const endpoint = 'https://serverlessworkflow.io';
+    const method = 'get';
+    const callHttp = callHTTPBuilder()
+      .with({
+        endpoint,
+        method,
+      })
+      .build();
+    expect(callHttp).toBeDefined();
+    expect(callHttp).toBeInstanceOf(Classes.CallHTTP);
+    expect(callHttp.call).toBe('http');
+    expect(callHttp.with).toBeDefined();
+    expect(callHttp.with!.endpoint).toBe(endpoint);
+    expect(callHttp.with!.method).toBe(method);
+  });
+
+  it('should build with input', () => {
+    const endpoint = 'https://serverlessworkflow.io';
+    const method = 'get';
+    const data = {
+      with: {
+        endpoint,
+        method,
+      },
+    };
+    const callHttp = callHTTPBuilder(data).build();
+    expect(callHttp).toBeDefined();
+    expect(callHttp).toBeInstanceOf(Classes.CallHTTP);
+    expect(callHttp.call).toBe('http');
+    expect(callHttp.with).toBeDefined();
+    expect(callHttp.with!.endpoint).toBe(endpoint);
+    expect(callHttp.with!.method).toBe(method);
+  });
+
+  it('should throw when invalid', () => {
+    const test = () => {
+      callHTTPBuilder().build();
+    };
+    expect(test).toThrow(Error);
+    expect(test).toThrow(/'CallHTTP' is invalid/);
+  });
+
+  it('should not throw when validation is disabled', () => {
+    const test = () => {
+      callHTTPBuilder().build({ validate: false });
+    };
+    expect(test).not.toThrow();
+  });
+});
diff --git a/tests/builders/use-extensions-builder.spec.ts b/tests/builders/use-extensions-builder.spec.ts
new file mode 100644
index 00000000..f10cb94f
--- /dev/null
+++ b/tests/builders/use-extensions-builder.spec.ts
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * oUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+import { useExtensionsBuilder } from '../../src/lib/generated/builders';
+import { Classes } from '../../src/lib/generated/classes';
+
+describe('UseExtensions builder', () => {
+  it('should build with fluent api', () => {
+    const extension = {
+      myExtension: {
+        extend: 'call' as const,
+      },
+    };
+    const useExtensions = useExtensionsBuilder().push(extension).build();
+    expect(useExtensions).toBeDefined();
+    expect(useExtensions).toBeInstanceOf(Classes.UseExtensions);
+    expect(useExtensions.length).toBe(1);
+    expect(useExtensions[0].myExtension).toEqual(extension.myExtension);
+  });
+
+  it('should build with input', () => {
+    const extension = {
+      myExtension: {
+        extend: 'call' as const,
+      },
+    };
+    const useExtensions = useExtensionsBuilder([extension]).build();
+    expect(useExtensions).toBeDefined();
+    expect(useExtensions).toBeInstanceOf(Classes.UseExtensions);
+    expect(useExtensions.length).toBe(1);
+    expect(useExtensions[0].myExtension).toEqual(extension.myExtension);
+  });
+
+  it('should throw with non-array', () => {
+    const test = () => {
+      useExtensionsBuilder({ foo: 'bar' } as any).build();
+    };
+    expect(test).toThrow(Error);
+    expect(test).toThrow('The provided model should be an array');
+  });
+
+  it('should throw when invalid', () => {
+    const test = () => {
+      useExtensionsBuilder([1, 2, 3] as any).build();
+    };
+    expect(test).toThrow(Error);
+    expect(test).toThrow(/'UseExtensions' is invalid/);
+  });
+
+  it('should not throw when validation is disabled', () => {
+    const test = () => {
+      useExtensionsBuilder([1, 2, 3] as any).build({ validate: false });
+    };
+    expect(test).not.toThrow();
+  });
+});
diff --git a/tests/builders/workflow-builder.spec.ts b/tests/builders/workflow-builder.spec.ts
new file mode 100644
index 00000000..8d7cac82
--- /dev/null
+++ b/tests/builders/workflow-builder.spec.ts
@@ -0,0 +1,137 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * oUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+import {
+  basicAuthenticationPolicyBuilder,
+  basicAuthenticationPropertiesBuilder,
+  bearerAuthenticationPolicyBuilder,
+  bearerAuthenticationPropertiesBuilder,
+  callHTTPBuilder,
+  documentBuilder,
+  hTTPArgumentsBuilder,
+  oAuth2AutenthicationDataClientBuilder,
+  oAuth2AuthenticationPolicyBuilder,
+  oAuth2ConnectAuthenticationPropertiesBuilder,
+  setTaskBuilder,
+  taskListBuilder,
+  useAuthenticationsBuilder,
+  useBuilder,
+  useFunctionsBuilder,
+  workflowBuilder,
+} from '../../src/lib/generated/builders';
+import { Classes } from '../../src/lib/generated/classes';
+
+import { schemaVersion } from '../../package.json';
+
+describe('Workflow builder', () => {
+  it('should build with fluent api', () => {
+    const workflow = workflowBuilder()
+      .document(documentBuilder().dsl(schemaVersion).name('test').version('1.0.0').namespace('default').build())
+      .do(
+        taskListBuilder()
+          .push({
+            step1: setTaskBuilder().set({ foo: 'bar' }).build(),
+          })
+          .build(),
+      )
+      .build();
+    expect(workflow).toBeDefined();
+    expect(workflow).toBeInstanceOf(Classes.Workflow);
+  });
+
+  it('should build a complex workflow with fluent api', () => {
+    const workflow = workflowBuilder()
+      .document(documentBuilder().dsl(schemaVersion).name('test').version('1.0.0').namespace('default').build())
+      .use(
+        useBuilder()
+          .authentications(
+            useAuthenticationsBuilder({
+              myBasicAuth: basicAuthenticationPolicyBuilder()
+                .basic(basicAuthenticationPropertiesBuilder().username('user').password('password').build())
+                .build(),
+              myBearerAuth: bearerAuthenticationPolicyBuilder()
+                .bearer(bearerAuthenticationPropertiesBuilder().token('token').build())
+                .build(),
+              myOAuthAuth: oAuth2AuthenticationPolicyBuilder()
+                .oauth2(
+                  oAuth2ConnectAuthenticationPropertiesBuilder()
+                    .grant('client_credentials')
+                    .authority('https://authority.com')
+                    .client(oAuth2AutenthicationDataClientBuilder().id('clientId').secret('clientSecret').build())
+                    .build(),
+                )
+                .build(),
+            }).build(),
+          )
+          .functions(
+            useFunctionsBuilder({
+              myCustomFunction: callHTTPBuilder()
+                .with(hTTPArgumentsBuilder().method('GET').endpoint('https://myapi.com').build())
+                .build(),
+            }).build(),
+          )
+          .build(),
+      )
+      .do(
+        taskListBuilder()
+          .push({
+            step1: setTaskBuilder().set({ foo: 'bar' }).build(),
+          })
+          .build(),
+      )
+      .build();
+    expect(workflow).toBeDefined();
+    expect(workflow).toBeInstanceOf(Classes.Workflow);
+  });
+
+  it('should build with input', () => {
+    const data = {
+      document: {
+        dsl: schemaVersion,
+        name: 'test',
+        version: '1.0.0',
+        namespace: 'default',
+      },
+      do: [
+        {
+          step1: {
+            set: {
+              foo: 'bar',
+            },
+          },
+        },
+      ],
+    };
+    const workflow = workflowBuilder(data).build();
+    expect(workflow).toBeDefined();
+    expect(workflow).toBeInstanceOf(Classes.Workflow);
+  });
+
+  it('should throw when invalid', () => {
+    const test = () => {
+      workflowBuilder().build();
+    };
+    expect(test).toThrow(Error);
+    expect(test).toThrow(/'Workflow' is invalid/);
+  });
+
+  it('should not throw when validation is disabled', () => {
+    const test = () => {
+      workflowBuilder().build({ validate: false });
+    };
+    expect(test).not.toThrow();
+  });
+});
diff --git a/tests/classes/use-extensions.spec.ts b/tests/classes/use-extensions.spec.ts
new file mode 100644
index 00000000..e4ed660a
--- /dev/null
+++ b/tests/classes/use-extensions.spec.ts
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * oUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+import { type } from 'ts-inference-check';
+import { Classes } from '../../src/lib/generated/classes';
+import { Specification } from '../../src/lib/generated/definitions';
+
+describe('UseExtensions class', () => {
+  it('should be an instance of UseExtensions', () => {
+    const useExtensions = new Classes.UseExtensions();
+    expect(useExtensions).toBeInstanceOf(Classes.UseExtensions);
+    expect(useExtensions.length).toBe(0);
+    expect(type(useExtensions.push).is<(...items: { [k: string]: Specification.Extension }[]) => number>(true)).toBe(
+      true,
+    );
+  });
+});
diff --git a/tests/classes/workflow.spec.ts b/tests/classes/workflow.spec.ts
new file mode 100644
index 00000000..d02a61c0
--- /dev/null
+++ b/tests/classes/workflow.spec.ts
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2021-Present The Serverless Workflow Specification Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * oUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+import { type } from 'ts-inference-check';
+import { Classes } from '../../src/lib/generated/classes';
+import { Specification } from '../../src/lib/generated/definitions';
+//import { schemaVersion } from '../../package.json';
+
+describe('Workflow class', () => {
+  it('should be an instance of Workflow', () => {
+    const workflow = new Classes.Workflow();
+    expect(workflow).toBeInstanceOf(Classes.Workflow);
+    expect(type(workflow.document).is(true)).toBe(true);
+    expect(type(workflow.input).is(true)).toBe(true);
+    expect(type(workflow.use).is(true)).toBe(true);
+    expect(type(workflow.do).is(true)).toBe(true);
+    expect(type(workflow.timeout).is(true)).toBe(true);
+    expect(type(workflow.output).is(true)).toBe(true);
+    expect(type(workflow.schedule).is(true)).toBe(true);
+    expect(type(workflow.foobar).is(true)).toBe(true);
+  });
+});
diff --git a/tests/examples/applicantrequest.json b/tests/examples/applicantrequest.json
deleted file mode 100644
index 9125e105..00000000
--- a/tests/examples/applicantrequest.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
-  "id": "applicantrequest",
-  "version": "1.0",
-  "specVersion": "0.7",
-  "name": "Applicant Request Decision Workflow",
-  "description": "Determine if applicant request is valid",
-  "start": "CheckApplication",
-  "functions": [
-    {
-      "name": "sendRejectionEmailFunction",
-      "operation": "http://myapis.org/applicationapi.json#emailRejection"
-    }
-  ],
-  "states":[
-    {
-      "type":"switch",
-      "name":"CheckApplication",
-      "dataConditions": [
-        {
-          "condition": "${ .applicants | .age >= 18 }",
-          "transition": "StartApplication"
-        },
-        {
-          "condition": "${ .applicants | .age < 18 }",
-          "transition": "RejectApplication"
-        }
-      ],
-      "defaultCondition": {
-        "transition": "RejectApplication"
-      }
-    },
-    {
-      "type": "operation",
-      "name": "StartApplication",
-      "actions": [
-        {
-          "subFlowRef": "startApplicationWorkflowId"
-        }
-      ],
-      "end": true
-    },
-    {
-      "type":"operation",
-      "name":"RejectApplication",
-      "actions":[
-        {
-          "functionRef": {
-            "refName": "sendRejectionEmailFunction",
-            "arguments": {
-              "applicant": "${ .applicant }"
-            }
-          }
-        }
-      ],
-      "end": true
-    }
-  ]
-}
diff --git a/tests/examples/applicantrequest.spec.ts b/tests/examples/applicantrequest.spec.ts
deleted file mode 100644
index 106fed6c..00000000
--- a/tests/examples/applicantrequest.spec.ts
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 2021-Present The Serverless Workflow Specification Authors
- * 

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * oUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -import * as fs from 'fs'; -import { - actionBuilder, - databasedswitchBuilder, - functionBuilder, - functionrefBuilder, - operationstateBuilder, - transitiondataconditionBuilder, - workflowBuilder, - defaultconditiondefBuilder, -} from '../../src'; - -describe('applicationrequest workflow example', () => { - it('should generate Workflow object', function () { - const workflow = workflowBuilder() - .id('applicantrequest') - .version('1.0') - .specVersion('0.7') - .name('Applicant Request Decision Workflow') - .description('Determine if applicant request is valid') - .start('CheckApplication') - .functions([ - functionBuilder() - .name('sendRejectionEmailFunction') - .operation('http://myapis.org/applicationapi.json#emailRejection') - .build(), - ]) - .states([ - databasedswitchBuilder() - .name('CheckApplication') - .dataConditions([ - transitiondataconditionBuilder() - .condition('${ .applicants | .age >= 18 }') - .transition('StartApplication') - .build(), - transitiondataconditionBuilder() - .condition('${ .applicants | .age < 18 }') - .transition('RejectApplication') - .build(), - ]) - .defaultCondition(defaultconditiondefBuilder().transition('RejectApplication').build()) - .build(), - operationstateBuilder() - .name('StartApplication') - .actionMode('sequential') - .actions([actionBuilder().subFlowRef('startApplicationWorkflowId').build()]) - .build(), - operationstateBuilder() - .name('RejectApplication') - .actionMode('sequential') - .actions([ - actionBuilder() - .functionRef( - functionrefBuilder() - .refName('sendRejectionEmailFunction') - .arguments({ applicant: '${ .applicant }' }) - .build() - ) - .build(), - ]) - .build(), - ]) - .build(); - - const expected = JSON.parse(fs.readFileSync('./tests/examples/applicantrequest.json', 'utf8')); - expect(JSON.stringify(workflow.normalize())).toEqual(JSON.stringify(expected)); - }); -}); diff --git a/tests/examples/booklending.json b/tests/examples/booklending.json deleted file mode 100644 index 1c59cc0d..00000000 --- a/tests/examples/booklending.json +++ /dev/null @@ -1,130 +0,0 @@ -{ - "id": "booklending", - "name": "Book Lending Workflow", - "version": "1.0", - "specVersion": "0.7", - "start": "Book Lending Request", - "states": [ - { - "type": "event", - "name": "Book Lending Request", - "onEvents": [ - { - "eventRefs": ["Book Lending Request Event"] - } - ], - "transition": "Get Book Status" - }, - { - "type": "operation", - "name": "Get Book Status", - "actions": [ - { - "functionRef": { - "refName": "Get status for book", - "arguments": { - "bookid": "${ .book.id }" - } - } - } - ], - "transition": "Book Status Decision" - }, - { - "type": "switch", - "name": "Book Status Decision", - "dataConditions": [ - { - "name": "Book is on loan", - "condition": "${ .book.status == \"onloan\" }", - "transition": "Report Status To Lender" - }, - { - "name": "Check is available", - "condition": "${ .book.status == \"available\" }", - "transition": "Check Out Book" - } - ] - }, - { - "type": "operation", - "name": "Report Status To Lender", - "actions": [ - { - "functionRef": { - "refName": "Send status to lender", - "arguments": { - "bookid": "${ .book.id }", - "message": "Book ${ .book.title } is already on loan" - } - } - } - ], - "transition": "Wait for Lender response" - }, - { - "type": "switch", - "name": "Wait for Lender response", - "eventConditions": [ - { - "name": "Hold Book", - "eventRef": "Hold Book Event", - "transition": "Request Hold" - }, - { - "name": "Decline Book Hold", - "eventRef": "Decline Hold Event", - "transition": "Cancel Request" - } - ] - }, - { - "type": "operation", - "name": "Request Hold", - "actions": [ - { - "functionRef": { - "refName": "Request hold for lender", - "arguments": { - "bookid": "${ .book.id }", - "lender": "${ .lender }" - } - } - } - ], - "transition": "Sleep two weeks" - }, - { - "type": "sleep", - "name": "Sleep two weeks", - "duration": "PT2W", - "transition": "Get Book Status" - }, - { - "type": "operation", - "name": "Check Out Book", - "actions": [ - { - "functionRef": { - "refName": "Check out book with id", - "arguments": { - "bookid": "${ .book.id }" - } - } - }, - { - "functionRef": { - "refName": "Notify Lender for checkout", - "arguments": { - "bookid": "${ .book.id }", - "lender": "${ .lender }" - } - } - } - ], - "end": true - } - ], - "functions": "file://books/lending/functions.json", - "events": "file://books/lending/events.json" -} diff --git a/tests/examples/booklending.spec.ts b/tests/examples/booklending.spec.ts deleted file mode 100644 index 92af9904..00000000 --- a/tests/examples/booklending.spec.ts +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright 2021-Present The Serverless Workflow Specification Authors - *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * oUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -import * as fs from 'fs'; -import { - actionBuilder, - databasedswitchBuilder, - eventbasedswitchBuilder, - eventstateBuilder, - oneventsBuilder, - operationstateBuilder, - transitiondataconditionBuilder, - transitioneventconditionBuilder, - workflowBuilder, - functionrefBuilder, - sleepstateBuilder, -} from '../../src'; - -describe('booklending workflow example', () => { - it('should generate Workflow object', function () { - const workflow = workflowBuilder() - .id('booklending') - .name('Book Lending Workflow') - .version('1.0') - .specVersion('0.7') - .start('Book Lending Request') - .states([ - eventstateBuilder() - .name('Book Lending Request') - .onEvents([oneventsBuilder().eventRefs(['Book Lending Request Event']).build()]) - .transition('Get Book Status') - .build(), - operationstateBuilder() - .name('Get Book Status') - .actions([ - actionBuilder() - .functionRef( - functionrefBuilder() - .refName('Get status for book') - .arguments({ - bookid: '${ .book.id }', - }) - .build() - ) - .build(), - ]) - .transition('Book Status Decision') - .build(), - databasedswitchBuilder() - .name('Book Status Decision') - .dataConditions([ - transitiondataconditionBuilder() - .name('Book is on loan') - .condition('${ .book.status == "onloan" }') - .transition('Report Status To Lender') - .build(), - transitiondataconditionBuilder() - .name('Check is available') - .condition('${ .book.status == "available" }') - .transition('Check Out Book') - .build(), - ]) - .build(), - operationstateBuilder() - .name('Report Status To Lender') - .actions([ - actionBuilder() - .functionRef( - functionrefBuilder() - .refName('Send status to lender') - .arguments({ - bookid: '${ .book.id }', - message: 'Book ${ .book.title } is already on loan', - }) - .build() - ) - .build(), - ]) - .transition('Wait for Lender response') - .build(), - eventbasedswitchBuilder() - .name('Wait for Lender response') - .eventConditions([ - transitioneventconditionBuilder() - .name('Hold Book') - .eventRef('Hold Book Event') - .transition('Request Hold') - .build(), - transitioneventconditionBuilder() - .name('Decline Book Hold') - .eventRef('Decline Hold Event') - .transition('Cancel Request') - .build(), - ]) - .build(), - operationstateBuilder() - .name('Request Hold') - .actions([ - actionBuilder() - .functionRef( - functionrefBuilder() - .refName('Request hold for lender') - .arguments({ - bookid: '${ .book.id }', - lender: '${ .lender }', - }) - .build() - ) - .build(), - ]) - .transition('Sleep two weeks') - .build(), - sleepstateBuilder().name('Sleep two weeks').duration('PT2W').transition('Get Book Status').build(), - operationstateBuilder() - .name('Check Out Book') - .actions([ - actionBuilder() - .functionRef( - functionrefBuilder() - .refName('Check out book with id') - .arguments({ - bookid: '${ .book.id }', - }) - .build() - ) - .build(), - actionBuilder() - .functionRef( - functionrefBuilder() - .refName('Notify Lender for checkout') - .arguments({ - bookid: '${ .book.id }', - lender: '${ .lender }', - }) - .build() - ) - .build(), - ]) - .build(), - ]) - .functions('file://books/lending/functions.json') - .events('file://books/lending/events.json') - .build(); - - const expected = JSON.parse(fs.readFileSync('./tests/examples/booklending.json', 'utf8')); - expect(JSON.stringify(workflow.normalize())).toEqual(JSON.stringify(expected)); - }); -}); diff --git a/tests/examples/carauctionbids.json b/tests/examples/carauctionbids.json deleted file mode 100644 index 66a435cf..00000000 --- a/tests/examples/carauctionbids.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "id": "handleCarAuctionBid", - "version": "1.0", - "specVersion": "0.7", - "name": "Car Auction Bidding Workflow", - "description": "Store a single bid whole the car auction is active", - "start": { - "stateName": "StoreCarAuctionBid", - "schedule": "R/PT2H" - }, - "functions": [ - { - "name": "StoreBidFunction", - "operation": "http://myapis.org/carauctionapi.json#storeBid" - } - ], - "events": [ - { - "name": "CarBidEvent", - "type": "carBidMadeType", - "source": "carBidEventSource" - } - ], - "states": [ - { - "type": "event", - "name": "StoreCarAuctionBid", - "onEvents": [ - { - "eventRefs": ["CarBidEvent"], - "actions": [{ - "functionRef": { - "refName": "StoreBidFunction", - "arguments": { - "bid": "${ .bid }" - } - } - }] - } - ], - "end": true - } - ] -} diff --git a/tests/examples/carauctionbids.spec.ts b/tests/examples/carauctionbids.spec.ts deleted file mode 100644 index 4d28cee5..00000000 --- a/tests/examples/carauctionbids.spec.ts +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2021-Present The Serverless Workflow Specification Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import * as fs from 'fs'; -import { - actionBuilder, - eventdefBuilder, - eventstateBuilder, - functionBuilder, - oneventsBuilder, - workflowBuilder, - functionrefBuilder, -} from '../../src'; - -describe('carauctionbids workflow example', () => { - it('should generate Workflow object', function () { - const workflow = workflowBuilder() - .id('handleCarAuctionBid') - .version('1.0') - .specVersion('0.7') - .name('Car Auction Bidding Workflow') - .description('Store a single bid whole the car auction is active') - .start({ - stateName: 'StoreCarAuctionBid', - schedule: 'R/PT2H', - }) - .functions([ - functionBuilder().name('StoreBidFunction').operation('http://myapis.org/carauctionapi.json#storeBid').build(), - ]) - .events([eventdefBuilder().name('CarBidEvent').type('carBidMadeType').source('carBidEventSource').build()]) - .states([ - eventstateBuilder() - .name('StoreCarAuctionBid') - .exclusive(true) - .onEvents([ - oneventsBuilder() - .eventRefs(['CarBidEvent']) - .actions([ - actionBuilder() - .functionRef( - functionrefBuilder() - .refName('StoreBidFunction') - .arguments({ - bid: '${ .bid }', - }) - .build() - ) - .build(), - ]) - .build(), - ]) - .build(), - ]) - .build(); - - const expected = JSON.parse(fs.readFileSync('./tests/examples/carauctionbids.json', 'utf8')); - expect(JSON.stringify(workflow.normalize())).toEqual(JSON.stringify(expected)); - }); -}); diff --git a/tests/examples/checkcarvitals.json b/tests/examples/checkcarvitals.json deleted file mode 100644 index 30009676..00000000 --- a/tests/examples/checkcarvitals.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "id": "checkcarvitals", - "name": "Check Car Vitals Workflow", - "version": "1.0", - "specVersion": "0.7", - "start": "WhenCarIsOn", - "states": [ - { - "type": "event", - "name": "WhenCarIsOn", - "onEvents": [ - { - "eventRefs": ["CarTurnedOnEvent"] - } - ], - "transition": "DoCarVitalChecks" - }, - { - "type": "operation", - "name": "DoCarVitalChecks", - "actions": [ - { - "subFlowRef": "vitalscheck", - "sleep": { - "after": "PT1S" - } - } - ], - "transition": "CheckContinueVitalChecks" - }, - { - "type": "switch", - "name": "CheckContinueVitalChecks", - "eventConditions": [ - { - "name": "Car Turned Off Condition", - "eventRef": "CarTurnedOffEvent", - "end": true - } - ], - "defaultCondition": { - "transition": "DoCarVitalsChecks" - } - } - ], - "events": [ - { - "name": "CarTurnedOnEvent", - "type": "car.events", - "source": "my/car" - }, - { - "name": "CarTurnedOffEvent", - "type": "car.events", - "source": "my/car" - } - ] -} diff --git a/tests/examples/checkcarvitals.spec.ts b/tests/examples/checkcarvitals.spec.ts deleted file mode 100644 index 594a48cb..00000000 --- a/tests/examples/checkcarvitals.spec.ts +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2021-Present The Serverless Workflow Specification Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as fs from 'fs'; -import { - eventdefBuilder, - actionBuilder, - operationstateBuilder, - eventstateBuilder, - oneventsBuilder, - workflowBuilder, - sleepBuilder, - eventbasedswitchBuilder, - enddeventconditionBuilder, - defaultconditiondefBuilder, -} from '../../src'; - -describe('checkcarvitals workflow example', () => { - it('should generate Workflow object', function () { - const workflow = workflowBuilder() - .id('checkcarvitals') - .name('Check Car Vitals Workflow') - .version('1.0') - .specVersion('0.7') - .start('WhenCarIsOn') - .states([ - eventstateBuilder() - .name('WhenCarIsOn') - .onEvents([oneventsBuilder().eventRefs(['CarTurnedOnEvent']).build()]) - .transition('DoCarVitalChecks') - .build(), - operationstateBuilder() - .name('DoCarVitalChecks') - .actions([actionBuilder().subFlowRef('vitalscheck').sleep(sleepBuilder().after('PT1S').build()).build()]) - - .transition('CheckContinueVitalChecks') - .build(), - - eventbasedswitchBuilder() - .name('CheckContinueVitalChecks') - .eventConditions([ - enddeventconditionBuilder() - .name('Car Turned Off Condition') - .eventRef('CarTurnedOffEvent') - .end(true) - .build(), - ]) - .defaultCondition(defaultconditiondefBuilder().transition('DoCarVitalsChecks').build()) - .build(), - ]) - .events([ - eventdefBuilder().name('CarTurnedOnEvent').type('car.events').source('my/car').build(), - eventdefBuilder().name('CarTurnedOffEvent').type('car.events').source('my/car').build(), - ]) - .build(); - - const expected = JSON.parse(fs.readFileSync('./tests/examples/checkcarvitals.json', 'utf8')); - expect(JSON.stringify(workflow.normalize())).toEqual(JSON.stringify(expected)); - }); -}); diff --git a/tests/examples/jobmonitoring.json b/tests/examples/jobmonitoring.json deleted file mode 100644 index d230eea8..00000000 --- a/tests/examples/jobmonitoring.json +++ /dev/null @@ -1,123 +0,0 @@ -{ - "id": "jobmonitoring", - "version": "1.0", - "specVersion": "0.7", - "name": "Job Monitoring", - "description": "Monitor finished execution of a submitted job", - "start": "SubmitJob", - "functions": [ - { - "name": "submitJob", - "operation": "http://myapis.org/monitorapi.json#doSubmit" - }, - { - "name": "checkJobStatus", - "operation": "http://myapis.org/monitorapi.json#checkStatus" - }, - { - "name": "reportJobSuceeded", - "operation": "http://myapis.org/monitorapi.json#reportSucceeded" - }, - { - "name": "reportJobFailed", - "operation": "http://myapis.org/monitorapi.json#reportFailure" - } - ], - "states":[ - { - "type":"operation", - "name":"SubmitJob", - "actions":[ - { - "functionRef": { - "refName": "submitJob", - "arguments": { - "name": "${ .job.name }" - } - }, - "actionDataFilter": { - "results": "${ .jobuid }" - } - } - ], - "stateDataFilter": { - "output": "${ .jobuid }" - }, - "transition": "WaitForCompletion" - }, - { - "type": "sleep", - "name": "WaitForCompletion", - "duration": "PT5S", - "transition": "GetJobStatus" - }, - { - "type":"operation", - "name":"GetJobStatus", - "actions":[ - { - "functionRef": { - "refName": "checkJobStatus", - "arguments": { - "name": "${ .jobuid }" - } - }, - "actionDataFilter": { - "results": "${ .jobstatus }" - } - } - ], - "stateDataFilter": { - "output": "${ .jobstatus }" - }, - "transition": "DetermineCompletion" - }, - { - "type":"switch", - "name":"DetermineCompletion", - "dataConditions": [ - { - "condition": "${ .jobStatus == \"SUCCEEDED\" }", - "transition": "JobSucceeded" - }, - { - "condition": "${ .jobStatus == \"FAILED\" }", - "transition": "JobFailed" - } - ], - "defaultCondition": { - "transition": "WaitForCompletion" - } - }, - { - "type":"operation", - "name":"JobSucceeded", - "actions":[ - { - "functionRef": { - "refName": "reportJobSuceeded", - "arguments": { - "name": "${ .jobuid }" - } - } - } - ], - "end": true - }, - { - "type":"operation", - "name":"JobFailed", - "actions":[ - { - "functionRef": { - "refName": "reportJobFailed", - "arguments": { - "name": "${ .jobuid }" - } - } - } - ], - "end": true - } - ] -} diff --git a/tests/examples/jobmonitoring.spec.ts b/tests/examples/jobmonitoring.spec.ts deleted file mode 100644 index eb3f9524..00000000 --- a/tests/examples/jobmonitoring.spec.ts +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright 2021-Present The Serverless Workflow Specification Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as fs from 'fs'; -import { - actionBuilder, - actiondatafilterBuilder, - databasedswitchBuilder, - functionBuilder, - functionrefBuilder, - operationstateBuilder, - statedatafilterBuilder, - transitiondataconditionBuilder, - workflowBuilder, - defaultconditiondefBuilder, - sleepstateBuilder, -} from '../../src'; - -describe('jobmonitoring workflow example', () => { - it('should generate Workflow object', function () { - const workflow = workflowBuilder() - .id('jobmonitoring') - .version('1.0') - .specVersion('0.7') - .name('Job Monitoring') - .description('Monitor finished execution of a submitted job') - .start('SubmitJob') - .functions([ - functionBuilder().name('submitJob').operation('http://myapis.org/monitorapi.json#doSubmit').build(), - functionBuilder().name('checkJobStatus').operation('http://myapis.org/monitorapi.json#checkStatus').build(), - functionBuilder() - .name('reportJobSuceeded') - .operation('http://myapis.org/monitorapi.json#reportSucceeded') - .build(), - functionBuilder().name('reportJobFailed').operation('http://myapis.org/monitorapi.json#reportFailure').build(), - ]) - .states([ - operationstateBuilder() - .name('SubmitJob') - .actionMode('sequential') - .actions([ - actionBuilder() - .functionRef( - functionrefBuilder() - .refName('submitJob') - .arguments({ - name: '${ .job.name }', - }) - .build() - ) - .actionDataFilter(actiondatafilterBuilder().results('${ .jobuid }').build()) - .build(), - ]) - .stateDataFilter(statedatafilterBuilder().output('${ .jobuid }').build()) - .transition('WaitForCompletion') - .build(), - sleepstateBuilder().name('WaitForCompletion').duration('PT5S').transition('GetJobStatus').build(), - operationstateBuilder() - .name('GetJobStatus') - .actionMode('sequential') - .actions([ - actionBuilder() - .functionRef( - functionrefBuilder() - .refName('checkJobStatus') - .arguments({ - name: '${ .jobuid }', - }) - .build() - ) - .actionDataFilter(actiondatafilterBuilder().results('${ .jobstatus }').build()) - .build(), - ]) - .stateDataFilter(statedatafilterBuilder().output('${ .jobstatus }').build()) - .transition('DetermineCompletion') - .build(), - databasedswitchBuilder() - .name('DetermineCompletion') - .dataConditions([ - transitiondataconditionBuilder() - .condition('${ .jobStatus == "SUCCEEDED" }') - .transition('JobSucceeded') - .build(), - transitiondataconditionBuilder().condition('${ .jobStatus == "FAILED" }').transition('JobFailed').build(), - ]) - .defaultCondition(defaultconditiondefBuilder().transition('WaitForCompletion').build()) - .build(), - operationstateBuilder() - .name('JobSucceeded') - .actionMode('sequential') - .actions([ - actionBuilder() - .functionRef( - functionrefBuilder() - .refName('reportJobSuceeded') - .arguments({ - name: '${ .jobuid }', - }) - .build() - ) - .build(), - ]) - .build(), - operationstateBuilder() - .name('JobFailed') - .actionMode('sequential') - .actions([ - actionBuilder() - .functionRef( - functionrefBuilder() - .refName('reportJobFailed') - .arguments({ - name: '${ .jobuid }', - }) - .build() - ) - .build(), - ]) - .build(), - ]) - .build(); - - const expected = JSON.parse(fs.readFileSync('./tests/examples/jobmonitoring.json', 'utf8')); - expect(JSON.stringify(workflow.normalize())).toEqual(JSON.stringify(expected)); - }); -}); diff --git a/tests/examples/parallel.json b/tests/examples/parallel.json deleted file mode 100644 index 8a7d80b5..00000000 --- a/tests/examples/parallel.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "id": "parallelexec", - "version": "1.0", - "specVersion": "0.7", - "name": "Parallel Execution Workflow", - "description": "Executes two branches in parallel", - "start": "ParallelExec", - "states":[ - { - "type": "parallel", - "name": "ParallelExec", - "branches": [ - { - "name": "ShortDelayBranch", - "actions": [{ - "subFlowRef": "shortdelayworkflowid" - }] - }, - { - "name": "LongDelayBranch", - "actions": [{ - "subFlowRef": "longdelayworkflowid" - }] - } - ], - "end": true - } - ] -} diff --git a/tests/examples/parallel.spec.ts b/tests/examples/parallel.spec.ts deleted file mode 100644 index 16ca4ad2..00000000 --- a/tests/examples/parallel.spec.ts +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2021-Present The Serverless Workflow Specification Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -import * as fs from 'fs'; -import { actionBuilder, branchBuilder, parallelstateBuilder, workflowBuilder } from '../../src'; - -describe('parallel workflow example', () => { - it('should generate Workflow object', function () { - const workflow = workflowBuilder() - .id('parallelexec') - .version('1.0') - .specVersion('0.7') - .name('Parallel Execution Workflow') - .description('Executes two branches in parallel') - .start('ParallelExec') - .states([ - parallelstateBuilder() - .name('ParallelExec') - .completionType('allOf') - .branches([ - branchBuilder() - .name('ShortDelayBranch') - .actions([actionBuilder().subFlowRef('shortdelayworkflowid').build()]) - .build(), - branchBuilder() - .name('LongDelayBranch') - .actions([actionBuilder().subFlowRef('longdelayworkflowid').build()]) - .build(), - ]) - .build(), - ]) - .build(); - - const expected = JSON.parse(fs.readFileSync('./tests/examples/parallel.json', 'utf8')); - expect(JSON.stringify(workflow.normalize())).toEqual(JSON.stringify(expected)); - }); -}); diff --git a/tests/examples/provisionorder.json b/tests/examples/provisionorder.json deleted file mode 100644 index 192d482c..00000000 --- a/tests/examples/provisionorder.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "id": "provisionorders", - "version": "1.0", - "specVersion": "0.7", - "name": "Provision Orders", - "description": "Provision Orders and handle errors thrown", - "start": "ProvisionOrder", - "functions": [ - { - "name": "provisionOrderFunction", - "operation": "http://myapis.org/provisioningapi.json#doProvision" - } - ], - "errors": [ - { - "name": "Missing order id" - }, - { - "name": "Missing order item" - }, - { - "name": "Missing order quantity" - } - ], - "states":[ - { - "type":"operation", - "name":"ProvisionOrder", - "actions":[ - { - "functionRef": { - "refName": "provisionOrderFunction", - "arguments": { - "order": "${ .order }" - } - } - } - ], - "stateDataFilter": { - "output": "${ .exceptions }" - }, - "transition": "ApplyOrder", - "onErrors": [ - { - "errorRef": "Missing order id", - "transition": "MissingId" - }, - { - "errorRef": "Missing order item", - "transition": "MissingItem" - }, - { - "errorRef": "Missing order quantity", - "transition": "MissingQuantity" - } - ] - }, - { - "type": "operation", - "name": "MissingId", - "actions": [ - { - "subFlowRef": "handleMissingIdExceptionWorkflow" - } - ], - "end": true - }, - { - "type": "operation", - "name": "MissingItem", - "actions": [ - { - "subFlowRef": "handleMissingItemExceptionWorkflow" - } - ], - "end": true - }, - { - "type": "operation", - "name": "MissingQuantity", - "actions": [ - { - "subFlowRef": "handleMissingQuantityExceptionWorkflow" - } - ], - "end": true - }, - { - "type": "operation", - "name": "ApplyOrder", - "actions": [ - { - "subFlowRef": "applyOrderWorkflowId" - } - ], - "end": true - } - ] -} diff --git a/tests/examples/provisionorder.spec.ts b/tests/examples/provisionorder.spec.ts deleted file mode 100644 index 044ec682..00000000 --- a/tests/examples/provisionorder.spec.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright 2021-Present The Serverless Workflow Specification Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as fs from 'fs'; -import { - actionBuilder, - errorBuilder, - functionBuilder, - operationstateBuilder, - statedatafilterBuilder, - workflowBuilder, - functionrefBuilder, - errordefBuilder, -} from '../../src'; - -describe('provisionorder workflow example', () => { - it('should generate Workflow object', function () { - const workflow = workflowBuilder() - .id('provisionorders') - .version('1.0') - .specVersion('0.7') - .name('Provision Orders') - .description('Provision Orders and handle errors thrown') - .start('ProvisionOrder') - .functions([ - functionBuilder() - .name('provisionOrderFunction') - .operation('http://myapis.org/provisioningapi.json#doProvision') - .build(), - ]) - .errors([ - errordefBuilder().name('Missing order id').build(), - errordefBuilder().name('Missing order item').build(), - errordefBuilder().name('Missing order quantity').build(), - ]) - .states([ - operationstateBuilder() - .name('ProvisionOrder') - .actionMode('sequential') - .actions([ - actionBuilder() - .functionRef( - functionrefBuilder() - .refName('provisionOrderFunction') - .arguments({ - order: '${ .order }', - }) - .build() - ) - .build(), - ]) - .stateDataFilter(statedatafilterBuilder().output('${ .exceptions }').build()) - .transition('ApplyOrder') - .onErrors([ - errorBuilder().errorRef('Missing order id').transition('MissingId').build(), - errorBuilder().errorRef('Missing order item').transition('MissingItem').build(), - errorBuilder().errorRef('Missing order quantity').transition('MissingQuantity').build(), - ]) - .build(), - operationstateBuilder() - .name('MissingId') - .actions([actionBuilder().subFlowRef('handleMissingIdExceptionWorkflow').build()]) - .build(), - operationstateBuilder() - .name('MissingItem') - .actions([actionBuilder().subFlowRef('handleMissingItemExceptionWorkflow').build()]) - .build(), - operationstateBuilder() - .name('MissingQuantity') - .actions([actionBuilder().subFlowRef('handleMissingQuantityExceptionWorkflow').build()]) - .build(), - operationstateBuilder() - .name('ApplyOrder') - .actions([actionBuilder().subFlowRef('applyOrderWorkflowId').build()]) - .build(), - ]) - .build(); - - const expected = JSON.parse(fs.readFileSync('./tests/examples/provisionorder.json', 'utf8')); - expect(JSON.stringify(workflow.normalize())).toEqual(JSON.stringify(expected)); - }); -}); diff --git a/tests/examples/sendcloudevent.json b/tests/examples/sendcloudevent.json deleted file mode 100644 index 7ab9429f..00000000 --- a/tests/examples/sendcloudevent.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "id": "sendcloudeventonprovision", - "version": "1.0", - "specVersion": "0.7", - "name": "Send CloudEvent on provision completion", - "start": "ProvisionOrdersState", - "events": [ - { - "kind": "produced", - "name": "provisioningCompleteEvent", - "type": "provisionCompleteType" - } - ], - "functions": [ - { - "name": "provisionOrderFunction", - "operation": "http://myapis.org/provisioning.json#doProvision" - } - ], - "states": [ - { - "type": "foreach", - "name": "ProvisionOrdersState", - "inputCollection": "${ .orders }", - "iterationParam": "singleorder", - "outputCollection": "${ .provisionedOrders }", - "actions": [ - { - "functionRef": { - "refName": "provisionOrderFunction", - "arguments": { - "order": "${ .singleorder }" - } - } - } - ], - "end": { - "produceEvents": [{ - "eventRef": "provisioningCompleteEvent", - "data": "${ .provisionedOrders }" - }] - } - } - ] -} diff --git a/tests/examples/sendcloudevent.spec.ts b/tests/examples/sendcloudevent.spec.ts deleted file mode 100644 index b747eeed..00000000 --- a/tests/examples/sendcloudevent.spec.ts +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2021-Present The Serverless Workflow Specification Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import * as fs from 'fs'; -import { - actionBuilder, - eventdefBuilder, - foreachstateBuilder, - functionBuilder, - produceeventdefBuilder, - workflowBuilder, - functionrefBuilder, - endBuilder, -} from '../../src'; - -describe('sendcloudevent workflow example', () => { - it('should generate Workflow object', function () { - const workflow = workflowBuilder() - .id('sendcloudeventonprovision') - .version('1.0') - .specVersion('0.7') - .name('Send CloudEvent on provision completion') - .start('ProvisionOrdersState') - .events([ - eventdefBuilder().name('provisioningCompleteEvent').type('provisionCompleteType').kind('produced').build(), - ]) - .functions([ - functionBuilder() - .name('provisionOrderFunction') - .operation('http://myapis.org/provisioning.json#doProvision') - .build(), - ]) - .states([ - foreachstateBuilder() - .name('ProvisionOrdersState') - .inputCollection('${ .orders }') - .iterationParam('singleorder') - .outputCollection('${ .provisionedOrders }') - .usedForCompensation(false) - .actions([ - actionBuilder() - .functionRef( - functionrefBuilder() - .refName('provisionOrderFunction') - .arguments({ - order: '${ .singleorder }', - }) - .build() - ) - .build(), - ]) - .end( - endBuilder() - .produceEvents([ - produceeventdefBuilder().eventRef('provisioningCompleteEvent').data('${ .provisionedOrders }').build(), - ]) - .build() - ) - .build(), - ]) - .build(); - - const expected = JSON.parse(fs.readFileSync('./tests/examples/sendcloudevent.json', 'utf8')); - expect(JSON.stringify(workflow.normalize())).toEqual(JSON.stringify(expected)); - }); -}); diff --git a/tests/examples/solvemathproblems.json b/tests/examples/solvemathproblems.json deleted file mode 100644 index 2b560181..00000000 --- a/tests/examples/solvemathproblems.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "id": "solvemathproblems", - "version": "1.0", - "specVersion": "0.7", - "name": "Solve Math Problems Workflow", - "description": "Solve math problems", - "start": "Solve", - "functions": [ - { - "name": "solveMathExpressionFunction", - "operation": "http://myapis.org/mapthapis.json#solveExpression" - } - ], - "states":[ - { - "type":"foreach", - "name":"Solve", - "inputCollection": "${ .expressions }", - "iterationParam": "singleexpression", - "outputCollection": "${ .results }", - "actions":[ - { - "functionRef": { - "refName": "solveMathExpressionFunction", - "arguments": { - "expression": "${ .singleexpression }" - } - } - } - ], - "stateDataFilter": { - "output": "${ .results }" - }, - "end": true - } - ] -} diff --git a/tests/examples/solvemathproblems.spec.ts b/tests/examples/solvemathproblems.spec.ts deleted file mode 100644 index 42adab1f..00000000 --- a/tests/examples/solvemathproblems.spec.ts +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2021-Present The Serverless Workflow Specification Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import * as fs from 'fs'; -import { - actionBuilder, - foreachstateBuilder, - functionBuilder, - statedatafilterBuilder, - workflowBuilder, - functionrefBuilder, -} from '../../src'; - -describe('solvemathproblems workflow example', () => { - it('should generate Workflow object', function () { - const workflow = workflowBuilder() - .id('solvemathproblems') - .version('1.0') - .specVersion('0.7') - .name('Solve Math Problems Workflow') - .description('Solve math problems') - .start('Solve') - .functions([ - functionBuilder() - .name('solveMathExpressionFunction') - .operation('http://myapis.org/mapthapis.json#solveExpression') - .build(), - ]) - .states([ - foreachstateBuilder() - .name('Solve') - .inputCollection('${ .expressions }') - .iterationParam('singleexpression') - .outputCollection('${ .results }') - .usedForCompensation(false) - .actions([ - actionBuilder() - .functionRef( - functionrefBuilder() - .refName('solveMathExpressionFunction') - .arguments({ - expression: '${ .singleexpression }', - }) - .build() - ) - .build(), - ]) - .stateDataFilter(statedatafilterBuilder().output('${ .results }').build()) - .build(), - ]) - .build(); - - const expected = JSON.parse(fs.readFileSync('./tests/examples/solvemathproblems.json', 'utf8')); - expect(JSON.stringify(workflow.normalize())).toEqual(JSON.stringify(expected)); - }); -}); diff --git a/tests/graph/graph.spec.ts b/tests/graph/graph.spec.ts new file mode 100644 index 00000000..3418e6ae --- /dev/null +++ b/tests/graph/graph.spec.ts @@ -0,0 +1,139 @@ +import { Specification } from '../../src'; +import { Classes } from '../../src/lib/generated/classes'; +import { buildGraph, Graph } from '../../src/lib/graph-builder'; + +describe('Workflow to Graph', () => { + it('should build a graph for a workflow with a Set task, using the buildGraph function', () => { + const workflow = Classes.Workflow.deserialize(` +document: + dsl: '1.0.0' + namespace: test + name: set + version: '0.1.0' +do: + - initialize: + set: + foo: bar`); + const graph = buildGraph(workflow); + expect(graph).toBeDefined(); + expect(graph.nodes.length).toBe(3); // start --> initialize --> end + expect(graph.edges.length).toBe(2); + }); + + it('should build a graph for a workflow with a Set task, using the instance method', () => { + const workflow = Classes.Workflow.deserialize(` +document: + dsl: '1.0.0' + namespace: test + name: set + version: '0.1.0' +do: + - initialize: + set: + foo: bar`); + const graph = workflow.toGraph(); + expect(graph).toBeDefined(); + expect(graph.nodes.length).toBe(3); // start --> initialize --> end + expect(graph.edges.length).toBe(2); + }); + + it('should build a graph for a workflow with a Set task, using the static method', () => { + const workflow = { + document: { + dsl: '1.0.0', + name: 'set', + version: '1.0.0', + namespace: 'test', + }, + do: [ + { + initialize: { + set: { + foo: 'bar', + }, + }, + }, + ], + } as Specification.Workflow; + const graph = Classes.Workflow.toGraph(workflow); + expect(graph).toBeDefined(); + expect(graph.nodes.length).toBe(3); // start --> initialize --> end + expect(graph.edges.length).toBe(2); + }); + + it('should build a graph for a workflow with multiple Set tasks', () => { + const workflow = Classes.Workflow.deserialize(` +document: + dsl: '1.0.0' + namespace: test + name: set + version: '0.1.0' +do: + - step1: + set: + foo: bar + - step2: + set: + foo2: bar + - step3: + set: + foo3: bar`); + const graph = buildGraph(workflow); + expect(graph).toBeDefined(); + expect(graph.nodes.length).toBe(5); // start --> step1 --> step2 --> step3 --> end + expect(graph.edges.length).toBe(4); + }); + + it('should build a graph for a workflow with a task containing an If clause, producing an alternative edge', () => { + const workflow = Classes.Workflow.deserialize(` +document: + dsl: '1.0.0' + namespace: test + name: set + version: '0.1.0' +do: + - initialize: + if: \${ input.data == true } + set: + foo: bar`); + const graph = buildGraph(workflow); + expect(graph).toBeDefined(); + expect(graph.nodes.length).toBe(3); // start --> initialize --> end + expect(graph.edges.length).toBe(3); // -----------------> + expect(graph.edges.filter((e) => e.label === '${ input.data == true }').length).toBe(1); + }); + + it('should build a graph for a workflow with a For task, producing a subgraph', () => { + const workflow = Classes.Workflow.deserialize(` +document: + dsl: '1.0.0' + namespace: test + name: for-example + version: '0.1.0' +do: + - checkup: + for: + each: pet + in: .pets + at: index + while: .vet != null + do: + - waitForCheckup: + listen: + to: + one: + with: + type: com.fake.petclinic.pets.checkup.completed.v2 + output: + as: '.pets + [{ "id": $pet.id }]'`); + const graph = buildGraph(workflow); + const forSubgraph = graph.nodes.find((node) => node.label === 'checkup') as Graph; + expect(graph).toBeDefined(); + expect(graph.nodes.length).toBe(3); // start --> checkup --> end + expect(graph.edges.length).toBe(2); + + expect(forSubgraph).toBeDefined(); + expect(forSubgraph.nodes.length).toBe(3); // entry --> waitForCheckup --> exit + expect(forSubgraph.edges.length).toBe(2); + }); +}); diff --git a/tests/lib/builders/eventstate-builder.spec.ts b/tests/lib/builders/eventstate-builder.spec.ts deleted file mode 100644 index 67079e6f..00000000 --- a/tests/lib/builders/eventstate-builder.spec.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2021-Present The Serverless Workflow Specification Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -import { eventstateBuilder } from '../../../src/lib/builders/eventstate-builder'; -import { oneventsBuilder } from '../../../src/lib/builders/onevents-builder'; - -describe('eventstateBuilder ', () => { - it('should build an object', () => { - const object = eventstateBuilder() - .name('Book Lending Request') - .onEvents([oneventsBuilder().eventRefs(['Book Lending Request Event']).build()]) - .transition('Get Book Status') - .build(); - - expect(object.exclusive).toBeTrue(); - - const serializedObject = object.normalize(); - expect(JSON.stringify(serializedObject)).toBe( - JSON.stringify({ - type: 'event', - name: 'Book Lending Request', - onEvents: [ - { - eventRefs: ['Book Lending Request Event'], - }, - ], - transition: 'Get Book Status', - }) - ); - }); -}); diff --git a/tests/lib/builders/function-builder.spec.ts b/tests/lib/builders/function-builder.spec.ts deleted file mode 100644 index ed17e4c7..00000000 --- a/tests/lib/builders/function-builder.spec.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2021-Present The Serverless Workflow Specification Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -import { functionBuilder } from '../../../src/lib/builders/function-builder'; - -describe('functionBuilder ', () => { - it('should build an object without default type if not set', () => { - const fn = functionBuilder().name('function').operation('operation').build(); - - expect(fn.type).toBe('rest'); - }); - - it('should build an object with type= set value ', () => { - expect(functionBuilder().name('function').operation('operation').type('expression').build().type).toBe( - 'expression' - ); - expect(functionBuilder().name('function').operation('operation').type('rest').build().type).toBe('rest'); - }); -}); diff --git a/tests/lib/definitions/branch.spec.ts b/tests/lib/definitions/branch.spec.ts deleted file mode 100644 index 976113b4..00000000 --- a/tests/lib/definitions/branch.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2021-Present The Serverless Workflow Specification Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -import { Branch } from '../../../src/lib/definitions/branch'; - -describe('Branch ', () => { - it('should convert non-primitive properties to the desired class', () => { - const data = { - actions: [{}], - }; - - const model = new Branch(data); - - expect(model.actions![0].constructor.name).toBe('Action'); - }); -}); diff --git a/tests/lib/definitions/eventdef.spec.ts b/tests/lib/definitions/eventdef.spec.ts deleted file mode 100644 index 091905ed..00000000 --- a/tests/lib/definitions/eventdef.spec.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2021-Present The Serverless Workflow Specification Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -import { Eventdef } from '../../../src/lib/definitions/eventdef'; - -describe('Eventdef ', () => { - it('should convert non-primitive properties to the desired class', () => { - // @ts-ignore - const data: Eventdef = { - correlation: [{ contextAttributeName: 'contextAttributeName' }], - metadata: { key: 'value' }, - }; - - const model = new Eventdef(data); - - expect(model.correlation![0].constructor.name).toBe('CorrelationDef'); - expect(model.metadata!.constructor.name).toBe('Metadata'); - }); -}); diff --git a/tests/lib/definitions/schedule.spec.ts b/tests/lib/definitions/schedule.spec.ts deleted file mode 100644 index 066a7e37..00000000 --- a/tests/lib/definitions/schedule.spec.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2021-Present The Serverless Workflow Specification Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -import { Schedule } from '../../../src/lib/definitions/schedule'; - -describe('schedule ', () => { - it('should convert non-primitive properties to the desired class', () => { - const data: Schedule = { - cron: { expression: '* * * ? * *' }, - }; - - const model = new Schedule(data); - expect(model.cron!.constructor.name).toBe('Crondef'); - }); - - it('should not convert primitive properties', () => { - const data: Schedule = { - cron: '* * * ? * *', - }; - - const model = new Schedule(data); - expect(typeof model.cron).toBe(typeof ''); - }); -}); diff --git a/tests/lib/definitions/util.spec.ts b/tests/lib/definitions/util.spec.ts deleted file mode 100644 index 9193c9d9..00000000 --- a/tests/lib/definitions/util.spec.ts +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright 2021-Present The Serverless Workflow Specification Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -import { - overwritePropertiesIfObject, - overwritePropertyAsPlainType, - overwriteTimeoutWithStateExecTimeout, -} from '../../../src/lib/definitions/utils'; -import { Properties } from '../../../src/lib/definitions/types'; -import { StateExecTimeout } from '../../../src/lib/definitions/stateExecTimeout'; - -describe('Util ', () => { - describe('overwritePropertyAsPlainType ', () => { - it('should create a copy of data property', () => { - class HasData { - data?: { - key: string; - }; - } - - const source = { - data: { - key: 'action', - }, - } as HasData; - - const target = {} as HasData; - Object.assign(target, source); - overwritePropertyAsPlainType('data', target); - - expect(target.data!.key).toBe('action'); - source.data!.key = 'action2'; - expect(target.data!.key).toBe('action'); - }); - - it('should create a copy of data property', () => { - class HasData { - data?: - | string - | { - [key: string]: any; - }; - } - - const source = { - data: { - key1: 'value1', - }, - } as HasData; - - const target = {} as HasData; - Object.assign(target, source); - overwritePropertyAsPlainType('data', target); - - // @ts-ignore - expect(target!.data['key1']).toBe('value1'); - // @ts-ignore - source!.data['key1'] = 'value2'; - // @ts-ignore - expect(target!.data['key1']).toBe('value1'); - }); - }); - - describe('overwritePropertiesIfObject ', () => { - class HasProperties { - properties: string | Properties; - } - - it('should create an instance of Basicpropsdef', () => { - const source = { - properties: { - username: 'name', - password: 'pwd', - }, - } as HasProperties; - - const target = Object.assign({}, source); - overwritePropertiesIfObject(target); - expect(target.properties.constructor.name).toBe('Basicpropsdef'); - }); - - it('should create an instance of Bearerpropsdef', () => { - const source = { - properties: { - token: 'token', - }, - } as HasProperties; - - const target = Object.assign({}, source); - overwritePropertiesIfObject(target); - expect(target.properties.constructor.name).toBe('Bearerpropsdef'); - }); - - it('should create an instance of Oauth2propsdef', () => { - const source = { - properties: { - grantType: 'password', - clientId: 'cid', - }, - } as HasProperties; - - const target = Object.assign({}, source); - overwritePropertiesIfObject(target); - expect(target.properties.constructor.name).toBe('Oauth2propsdef'); - }); - - it('should not create an instance of Properties type', () => { - const source = { - properties: 'any value', - } as HasProperties; - - const target = Object.assign({}, source); - overwritePropertiesIfObject(target); - expect(target.properties.constructor.name).toBe('String'); - }); - }); - - describe('overwriteTimeoutWithStateExecTimeout ', () => { - it('should create an instance of StateExecTimeout only for stateExecTimeout property ', () => { - class HasStateExecTimeout { - timeouts?: { - stateExecTimeout?: StateExecTimeout; - eventTimeout?: string; - }; - } - - const source = { - timeouts: { - stateExecTimeout: { - total: 'P3Y6M4DT12H30M5S', - }, - eventTimeout: 'eventTimeoutValue', - }, - } as HasStateExecTimeout; - - const target = Object.assign({}, source); - overwriteTimeoutWithStateExecTimeout(target); - expect(target.timeouts!.stateExecTimeout!.constructor.name).toBe('StateExecTimeout'); - - expect(target.timeouts!.eventTimeout).toBe('eventTimeoutValue'); - source.timeouts!.eventTimeout = 'eventTimeoutValue2'; - expect(target.timeouts!.eventTimeout).toBe('eventTimeoutValue'); - }); - }); -}); diff --git a/tests/lib/definitions/workflow-converter-hello-world.json b/tests/lib/definitions/workflow-converter-hello-world.json deleted file mode 100644 index 5d763aff..00000000 --- a/tests/lib/definitions/workflow-converter-hello-world.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "id": "helloworld", - "version": "1.0", - "specVersion": "0.7", - "name": "Hello World Workflow", - "description": "Inject Hello World", - "start": "Hello State", - "states":[ - { - "type":"inject", - "name":"Hello State", - "data": { - "result": "Hello World!" - }, - "end": true - } - ] -} diff --git a/tests/lib/definitions/workflow-converter-hello-world.xxx b/tests/lib/definitions/workflow-converter-hello-world.xxx deleted file mode 100644 index b9aadde5..00000000 --- a/tests/lib/definitions/workflow-converter-hello-world.xxx +++ /dev/null @@ -1 +0,0 @@ -{ invalid? \ No newline at end of file diff --git a/tests/lib/definitions/workflow-converter-hello-world.yaml b/tests/lib/definitions/workflow-converter-hello-world.yaml deleted file mode 100644 index 854b4a4b..00000000 --- a/tests/lib/definitions/workflow-converter-hello-world.yaml +++ /dev/null @@ -1,12 +0,0 @@ -id: helloworld -version: '1.0' -specVersion": '0.7' -name: Hello World Workflow -description: Inject Hello World -start: Hello State -states: - - type: inject - name: Hello State - data: - result: Hello World! - end: true diff --git a/tests/lib/definitions/workflow-converter-hello-world.yml b/tests/lib/definitions/workflow-converter-hello-world.yml deleted file mode 100644 index 854b4a4b..00000000 --- a/tests/lib/definitions/workflow-converter-hello-world.yml +++ /dev/null @@ -1,12 +0,0 @@ -id: helloworld -version: '1.0' -specVersion": '0.7' -name: Hello World Workflow -description: Inject Hello World -start: Hello State -states: - - type: inject - name: Hello State - data: - result: Hello World! - end: true diff --git a/tests/lib/definitions/workflow.spec.ts b/tests/lib/definitions/workflow.spec.ts deleted file mode 100644 index 57cb800f..00000000 --- a/tests/lib/definitions/workflow.spec.ts +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright 2021-Present The Serverless Workflow Specification Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -import { injectstateBuilder, Specification, workflowBuilder } from '../../../src'; -import { readFileSync } from 'fs'; -import { Workflow } from '../../../src/lib/definitions/workflow'; - -describe('workflow fromSource', () => { - const testCases = [ - { - description: 'should generate workflow object from JSON file', - file: './tests/lib/definitions/workflow-converter-hello-world.json', - }, - { - description: 'should generate workflow object from YAML file', - file: './tests/lib/definitions/workflow-converter-hello-world.yaml', - }, - { - description: 'should generate workflow object from YML file', - file: './tests/lib/definitions/workflow-converter-hello-world.yml', - }, - ]; - testCases.forEach((test) => { - it(test.description, function () { - const workflow: Specification.Workflow = Workflow.fromSource(readFileSync(test.file, 'utf-8')); - expect(workflow.id).toBe('helloworld'); - expect(workflow.version).toBe('1.0'); - expect(workflow.name).toBe('Hello World Workflow'); - expect(workflow.description).toBe('Inject Hello World'); - expect(workflow.start).toBe('Hello State'); - }); - }); - - it('should throws error if format is not json or yaml', () => { - expect(() => { - Workflow.fromSource(readFileSync('./tests/lib/definitions/workflow-converter-hello-world.xxx', 'utf-8')); - }).toThrow(new Error('Format not supported')); - }); -}); - -describe('workflow ', () => { - it('should convert non-primitive properties to the desired class', () => { - const data = { - functions: [ - { - name: 'Function', - operation: 'operationFunction', - }, - ], - events: [ - { - name: 'CarBidEvent', - type: 'carBidMadeType', - source: 'carBidEventSource', - }, - ], - retries: [ - { - name: 'retrie', - maxAttempts: 4, - }, - ], - timeouts: { - duration: 'P30M5S', - }, - metadata: { - key: 'value', - }, - }; - - const model = new Workflow(data); - - expect(model.functions![0]!.constructor.name).toBe('Function'); - expect(model.timeouts!.constructor.name).toBe('Timeouts'); - expect(model.metadata!.constructor.name).toBe('Metadata'); - expect(model.events![0]!.constructor.name).toBe('Eventdef'); - expect(model.retries![0]!.constructor.name).toBe('Retrydef'); - }); - - it('should generate JSON from workflow object', () => { - const jsonWorkflow: string = Workflow.toJson( - workflowBuilder() - .id('helloworld') - .version('1.0') - .specVersion('0.7') - .name('Hello World Workflow') - .description('Inject Hello World') - .start('Hello State') - .states([ - injectstateBuilder() - .name('Hello State') - .data({ - result: 'Hello World!', - }) - .end(true) - .build(), - ]) - .build() - ); - expect(jsonWorkflow).toBe( - '{' + - '"id":"helloworld",' + - '"version":"1.0",' + - '"specVersion":"0.7",' + - '"name":"Hello World Workflow",' + - '"description":"Inject Hello World",' + - '"start":"Hello State",' + - '"states":[' + - '{' + - '"type":"inject",' + - '"name":"Hello State",' + - '"data":{' + - '"result":"Hello World!"' + - '},' + - '"end":true' + - '}' + - ']' + - '}' - ); - }); - - it('should generate YAML from workflow object', () => { - const yamlWorkflow: string = Workflow.toYaml( - workflowBuilder() - .id('helloworld') - .version('1.0') - .specVersion('0.7') - .name('Hello World Workflow') - .description('Inject Hello World') - .start('Hello State') - .states([ - injectstateBuilder() - .name('Hello State') - .data({ - result: 'Hello World!', - }) - .end(true) - .build(), - ]) - .build() - ); - expect(yamlWorkflow).toBe( - 'id: helloworld\n' + - "version: '1.0'\n" + - "specVersion: '0.7'\n" + - 'name: Hello World Workflow\n' + - 'description: Inject Hello World\n' + - 'start: Hello State\n' + - 'states:\n' + - ' - type: inject\n' + - ' name: Hello State\n' + - ' data:\n' + - ' result: Hello World!\n' + - ' end: true\n' - ); - }); -}); diff --git a/tests/lib/utils.spec.ts b/tests/lib/utils.spec.ts deleted file mode 100644 index 9b0723ab..00000000 --- a/tests/lib/utils.spec.ts +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2021-Present The Serverless Workflow Specification Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { validate } from '../../src/lib/utils'; - -describe('validate', () => { - it('should throw an error containing the provided data', () => { - expect(() => validate('End', 'any text')).toThrowError(/any text/); - }); - - it('should return true for valid objects', () => { - expect(validate('End', false)).toBeTruthy('Expected function validate to return true for valid objects'); - }); - - it('should ignore "normalize" function as additionalProperty', () => { - const functionObj = { - name: 'function', - operation: 'operation', - type: 'rest', - normalize: () => { - //do something - }, - }; - - expect(validate('Function', functionObj)).toBeTruthy(); - }); - - it('should NOT ignore additionalProperties', () => { - const functionObj = { - name: 'function', - operation: 'operation', - type: 'rest', - keyAdditionalProperty: 'anyValue', - }; - - expect(() => validate('Function', functionObj)).toThrowError(/keyAdditionalProperty/); - }); - - it('should throws an error if validator not found', () => { - expect(() => validate('ValidatorNotDefined', {})).toThrowError(); - }); -}); diff --git a/tests/lib/workflow-validator.spec.ts b/tests/lib/workflow-validator.spec.ts deleted file mode 100644 index 396897ff..00000000 --- a/tests/lib/workflow-validator.spec.ts +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2021-Present The Serverless Workflow Specification Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -import { ValidationError, WorkflowValidator } from '../../src'; -import { Workflow } from '../../src/lib/definitions/workflow'; - -describe('workflow-validator', () => { - it('should return errors instance of ValidationError if the workflow provided is not valid', () => { - // @ts-ignore - const workflow = { - id: 'helloworld', - name: 'Hello World Workflow', - version: '1.0', - specVersion: '0.7', - description: 'Inject Hello World', - start: 'Hello State', - states: [], - } as Workflow; - - const workflowValidator = new WorkflowValidator(workflow); - expect(workflowValidator.isValid).toBeFalsy('Expected isValid to be false'); - expect(workflowValidator.errors.length).toBe(1); - expect(workflowValidator.errors[0].constructor === ValidationError).toBeTruthy( - 'Expected errors to be instance of ValidationError' - ); - expect(workflowValidator.errors[0].message).toMatch('states'); - }); - - it('should have no errors if the workflow is valid', () => { - // @ts-ignore - const workflow = { - id: 'helloworld', - version: '1.0', - specVersion: '0.7', - name: 'Hello World Workflow', - description: 'Inject Hello World', - start: 'Hello State', - states: [ - { - name: 'Hello State', - type: 'inject', - data: { - result: 'Hello World!', - }, - end: true, - }, - ], - } as Workflow; - - const workflowValidator = new WorkflowValidator(workflow); - expect(workflowValidator.errors.length).toBe(0); - expect(workflowValidator.isValid).toBeTruthy('Expected isValid to be true'); - }); -}); diff --git a/tests/mermaid/mermaid.spec.ts b/tests/mermaid/mermaid.spec.ts new file mode 100644 index 00000000..4c32ff3a --- /dev/null +++ b/tests/mermaid/mermaid.spec.ts @@ -0,0 +1,182 @@ +import { Classes } from '../../src/lib/generated/classes'; +import { Specification } from '../../src/lib/generated/definitions'; +import { convertToMermaidCode, MermaidDiagram } from '../../src/lib/mermaid-converter'; + +describe('Workflow to MermaidJS Flowchart', () => { + it('should build a Mermaid diagram for a workflow with a Set task, using the convertToMermaidCode function', () => { + const workflow = Classes.Workflow.deserialize(` +document: + dsl: '1.0.0' + namespace: test + name: set + version: '0.1.0' +do: + - initialize: + set: + foo: bar`); + const mermaidCode = convertToMermaidCode(workflow).trim(); + expect(mermaidCode).toBe( + `flowchart TD + root-entry-node(( )) + root-exit-node((( ))) + /do/0/initialize["initialize"] + /do/0/initialize --> root-exit-node + root-entry-node --> /do/0/initialize + + +classDef hidden display: none;`.trim(), + ); + }); + + it('should build a Mermaid diagram for a workflow with a Set task, using the instance method', () => { + const workflow = Classes.Workflow.deserialize(` +document: + dsl: '1.0.0' + namespace: test + name: set + version: '0.1.0' +do: + - initialize: + set: + foo: bar`); + const mermaidCode = workflow.toMermaidCode().trim(); + expect(mermaidCode).toBe( + `flowchart TD + root-entry-node(( )) + root-exit-node((( ))) + /do/0/initialize["initialize"] + /do/0/initialize --> root-exit-node + root-entry-node --> /do/0/initialize + + +classDef hidden display: none;`.trim(), + ); + }); + + it('should build a Mermaid diagram for a workflow with a Set task, using the static method', () => { + const workflow = { + document: { + dsl: '1.0.0', + name: 'set', + version: '1.0.0', + namespace: 'test', + }, + do: [ + { + initialize: { + set: { + foo: 'bar', + }, + }, + }, + ], + } as Specification.Workflow; + const mermaidCode = Classes.Workflow.toMermaidCode(workflow).trim(); + expect(mermaidCode).toBe( + `flowchart TD + root-entry-node(( )) + root-exit-node((( ))) + /do/0/initialize["initialize"] + /do/0/initialize --> root-exit-node + root-entry-node --> /do/0/initialize + + +classDef hidden display: none;`.trim(), + ); + }); + + it('should build a Mermaid diagram for a workflow with a Set task, using the legacy MermaidDiagram class', () => { + const workflow = Classes.Workflow.deserialize(` +document: + dsl: '1.0.0' + namespace: test + name: set + version: '0.1.0' +do: + - initialize: + set: + foo: bar`); + const mermaidCode = new MermaidDiagram(workflow).sourceCode().trim(); + expect(mermaidCode).toBe( + `flowchart TD + root-entry-node(( )) + root-exit-node((( ))) + /do/0/initialize["initialize"] + /do/0/initialize --> root-exit-node + root-entry-node --> /do/0/initialize + + +classDef hidden display: none;`.trim(), + ); + }); + + it('should build a Mermaid diagram with an alternative, labelled, edge', () => { + const workflow = Classes.Workflow.deserialize(` +document: + dsl: '1.0.0' + namespace: test + name: set + version: '0.1.0' +do: + - initialize: + if: \${ input.data == true } + set: + foo: bar`); + const mermaidCode = convertToMermaidCode(workflow).trim(); + expect(mermaidCode).toBe( + `flowchart TD + root-entry-node(( )) + root-exit-node((( ))) + /do/0/initialize["initialize"] + /do/0/initialize --> root-exit-node + root-entry-node --"\${ input.data == true }"--> /do/0/initialize + root-entry-node --> root-exit-node + + +classDef hidden display: none;`.trim(), + ); + }); + + it('should build a Mermaid diagram for a workflow with a For task', () => { + const workflow = Classes.Workflow.deserialize(` +document: + dsl: '1.0.0' + namespace: test + name: for-example + version: '0.1.0' +do: + - checkup: + for: + each: pet + in: .pets + at: index + while: .vet != null + do: + - waitForCheckup: + listen: + to: + one: + with: + type: com.fake.petclinic.pets.checkup.completed.v2 + output: + as: '.pets + [{ "id": $pet.id }]'`); + const mermaidCode = convertToMermaidCode(workflow).trim(); + expect(mermaidCode).toBe( + `flowchart TD + root-entry-node(( )) + root-exit-node((( ))) + subgraph /do/0/checkup ["checkup"] + /do/0/checkup-entry-node:::hidden + /do/0/checkup-exit-node:::hidden + /do/0/checkup/for/do/0/waitForCheckup["waitForCheckup"] + /do/0/checkup/for/do/0/waitForCheckup --- /do/0/checkup-exit-node + /do/0/checkup-entry-node --> /do/0/checkup/for/do/0/waitForCheckup + end + /do/0/checkup-exit-node --> root-exit-node + root-entry-node --- /do/0/checkup-entry-node + + +classDef hidden display: none;`.trim(), + ); + }); +}); diff --git a/tests/serialization/workflow-serialization.spec.ts b/tests/serialization/workflow-serialization.spec.ts new file mode 100644 index 00000000..38b30980 --- /dev/null +++ b/tests/serialization/workflow-serialization.spec.ts @@ -0,0 +1,111 @@ +/* + * Copyright 2021-Present The Serverless Workflow Specification Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * oUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { Specification } from '../../src/lib/generated/definitions'; +import { Classes } from '../../src/lib/generated/classes'; + +import { schemaVersion } from '../../package.json'; +import { documentBuilder, setTaskBuilder, taskListBuilder, workflowBuilder } from '../../src'; + +describe('Workflow (de)serialization', () => { + it('should deserialize JSON', () => { + const data: Specification.Workflow = { + document: { + dsl: schemaVersion, + name: 'test', + version: '1.0.0', + namespace: 'default', + }, + do: [ + { + step1: { + set: { + foo: 'bar', + }, + }, + }, + ], + }; + const dataJson = JSON.stringify(data); + const workflow = Classes.Workflow.deserialize(dataJson); + expect(workflow).toBeInstanceOf(Classes.Workflow); + }); + + it('should serialize as JSON from static method', () => { + const data: Specification.Workflow = { + document: { + dsl: schemaVersion, + name: 'test', + version: '1.0.0', + namespace: 'default', + }, + do: [ + { + step1: { + set: { + foo: 'bar', + }, + }, + }, + ], + }; + const workflow = new Classes.Workflow(data); + const expected = JSON.stringify(data); + const serialized = Classes.Workflow.serialize(workflow, 'json'); + expect(serialized).toEqual(expected); + }); + + it('should serialize as JSON from instance method', () => { + const data: Specification.Workflow = { + document: { + dsl: schemaVersion, + name: 'test', + version: '1.0.0', + namespace: 'default', + }, + do: [ + { + step1: { + set: { + foo: 'bar', + }, + }, + }, + ], + }; + const workflow = new Classes.Workflow(data); + const expected = JSON.stringify(data); + const serialized = workflow.serialize('json'); + expect(serialized).toEqual(expected); + }); + + it('should serialize as JSON from from static method from fluently built workflow', () => { + const workflow = workflowBuilder() + .document(documentBuilder().dsl('1.0.0').name('test').version('1.0.0').namespace('default').build()) + .do( + taskListBuilder() + .push({ + step1: setTaskBuilder().set({ foo: 'bar' }).build(), + }) + .build(), + ) + .build(); + const expected = JSON.stringify(workflow); + const serialized = Classes.Workflow.serialize(workflow, 'json'); + expect(serialized).toEqual(expected); + }); +}); diff --git a/tests/support/jasmine.json b/tests/support/jasmine.json deleted file mode 100644 index 6e6e029e..00000000 --- a/tests/support/jasmine.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "spec_dir": "out-tsc/tests", - "spec_files": [ - "**/*[sS]pec.js" - ], - "stopSpecOnExpectationFailure": false, - "random": true -} diff --git a/tests/tsconfig.json b/tests/tsconfig.json index 755706b4..92c22bf1 100644 --- a/tests/tsconfig.json +++ b/tests/tsconfig.json @@ -5,6 +5,6 @@ }, "include": [ "../src/**/*.ts", - "../**/*.spec.ts", + "../**/*.spec.ts" ] } diff --git a/tests/validation/workflow-validation.spec.ts b/tests/validation/workflow-validation.spec.ts new file mode 100644 index 00000000..b645ac3f --- /dev/null +++ b/tests/validation/workflow-validation.spec.ts @@ -0,0 +1,74 @@ +/* + * Copyright 2021-Present The Serverless Workflow Specification Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * oUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { Classes } from '../../src/lib/generated/classes'; +import { validate } from '../../src/lib/validation'; + +import { schemaVersion } from '../../package.json'; + +describe('Workflow validation', () => { + it('should be valid', () => { + const workflow = new Classes.Workflow({ + document: { + dsl: schemaVersion, + name: 'test', + version: '1.0.0', + namespace: 'default', + }, + do: [ + { + step1: { + set: { + foo: 'bar', + }, + }, + }, + ], + }); + const test = () => validate('Workflow', workflow); + expect(test).not.toThrow(Error); + }); + + it('should throw when invalid', () => { + const workflow = new Classes.Workflow({ + document: { + dsl: schemaVersion, + name: 'test', + version: '1.0.0', + namespace: 'default', + }, + }); + const test = () => validate('Workflow', workflow); + expect(test).toThrow(Error); + expect(test).toThrow(/'Workflow' is invalid/); + }); + + it('should throw with incompatible DSL version', () => { + const oldVersion = '0.9'; + const workflow = new Classes.Workflow({ + document: { + dsl: oldVersion, + name: 'test', + version: '1.0.0', + namespace: 'default', + }, + }); + expect(() => workflow.validate()).toThrow( + `The DSL version of the workflow '${oldVersion}' doesn't match the supported version of the SDK '${schemaVersion}'.`, + ); + }); +}); diff --git a/tools/download-schemas.ts b/tools/1_download-schemas.ts similarity index 64% rename from tools/download-schemas.ts rename to tools/1_download-schemas.ts index 9984d005..f81f6020 100644 --- a/tools/download-schemas.ts +++ b/tools/1_download-schemas.ts @@ -17,52 +17,50 @@ import $RefParser from '@apidevtools/json-schema-ref-parser'; import { promises as fsPromises } from 'fs'; import * as path from 'path'; import { URL } from 'url'; -import yargs from 'yargs'; -import { schemaVersion } from '../package.json'; -import { mergeDefinitions, mergeSchemas, reset } from './utils'; +import { schemaDir, reset, jsonSchemaUrl, yamlSchemaUrl } from './utils'; +import * as yaml from 'js-yaml'; + const { writeFile, mkdir } = fsPromises; /** * Downloads the given schema (and referenced sub-schema) and save them to disk - * A merged schema is also saved as `__merged.json` * @param schemaUrl {string} The URL to download the schema from * @param destDir {string} The destination path to save the schema to * @returns {void} */ const download = async (schemaUrl: URL, destDir: string): Promise => { try { - await reset(destDir); const fileName = path.basename(schemaUrl.pathname); + const isJson = fileName.endsWith('.json'); const urlBase = schemaUrl.href.replace(fileName, ''); const $refParser = new $RefParser(); await $refParser.resolve(schemaUrl.href); const externalSchemas = $refParser.$refs .paths() .filter((p, index, arr) => arr.indexOf(p) === index && p !== schemaUrl.href); - await writeFile(path.resolve(destDir, fileName), JSON.stringify($refParser.schema, null, 2)); + await writeFile( + path.resolve(destDir, fileName), + isJson ? JSON.stringify($refParser.schema, null, 2) : yaml.dump($refParser.schema), + ); externalSchemas.forEach(async (externalSchemaUrl: string) => { const externalSchema = $refParser.$refs.get(externalSchemaUrl); if (externalSchema) { const externalSchemaFileName = externalSchemaUrl.replace(urlBase, ''); await mkdir(path.resolve(destDir, path.dirname(externalSchemaFileName)), { recursive: true }); - await writeFile(path.resolve(destDir, externalSchemaFileName), JSON.stringify(externalSchema, null, 2)); + await writeFile( + path.resolve(destDir, externalSchemaFileName), + isJson ? JSON.stringify(externalSchema, null, 2) : yaml.dump(externalSchema), + ); } }); - const known$Refs = new Map(); - await mergeDefinitions($refParser, externalSchemas, known$Refs); - mergeSchemas($refParser, known$Refs, $refParser.schema, '#/'); - await writeFile(path.resolve(destDir, '__merged.json'), JSON.stringify($refParser.schema, null, 2)); return Promise.resolve(); } catch (ex) { return Promise.reject(ex); } }; -const argv = yargs(process.argv.slice(2)).argv; -const schemaUrl: URL = new URL( - (argv.url as string) || - `https://raw.githubusercontent.com/serverlessworkflow/specification/${schemaVersion}.x/schema/workflow.json` -); -const destDir = path.resolve(process.cwd(), 'src/lib/schema'); - -download(schemaUrl, destDir).then(console.log.bind(console)).catch(console.error.bind(console)); +reset(schemaDir) + .then(() => download(yamlSchemaUrl, schemaDir)) + .then(() => download(jsonSchemaUrl, schemaDir)) + .then(console.log.bind(console)) + .catch(console.error.bind(console)); diff --git a/tools/2_generate-definitions.ts b/tools/2_generate-definitions.ts new file mode 100644 index 00000000..6e882196 --- /dev/null +++ b/tools/2_generate-definitions.ts @@ -0,0 +1,227 @@ +/* + * Copyright 2021-Present The Serverless Workflow Specification Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { compile, JSONSchema, Options } from 'json-schema-to-typescript'; +import { promises as fsPromises } from 'fs'; +import * as path from 'path'; +import { fileHeader, inFileDisclaimer } from './consts'; +import { definitionsDir, isObject, reset, schemaDir, toPascalCase } from './utils'; +import * as yaml from 'js-yaml'; + +const { writeFile, readFile } = fsPromises; + +const structuralObjectProperties = [ + '$defs', + 'definitions', + 'properties', + 'patternProperties', + 'additionalProperties', + 'dependencies', + 'dependentSchemas', + 'if', + //'then', // creates a duplicate FlowDirective because of switch case then + 'else', + 'not', + 'items', + 'additionalItems', + 'unevaluatedItems', + 'contains', + 'propertyNames', + 'unevaluatedProperties', +]; + +const structuralArrayProperties = [ + 'allOf', + 'anyOf', + 'oneOf', + 'items', + 'enum', + 'type', + 'examples', + 'required', + 'dependentRequired', +]; + +const metadataProperties = ['title', 'description', 'default', 'type']; + +/** + * Embellishes the provided schema to increase its compatibility with json-schema-to-typescript, the resulting schema should keep the validation properties as the input one (phase 1) + * - adds missing type:object properties // not necessary ? + * - adds missing titles to objects + * - removes extra titles on value types + * @param schema The schema to embellish + * @param path The current path of the schema relative to the original schema + * @param parentTitle The title of the parent object, if any + * @returns An embellished schema with titles and types + */ +function prepareSchema(schema: any, path: string[] = ['#'], parentTitle: string = ''): any { + if (!isObject(schema) && !Array.isArray(schema)) { + return schema; + } + if (Array.isArray(schema)) { + return schema.map((item, i) => prepareSchema(item, [...path, i.toString()], parentTitle)); + } + const newSchema = JSON.parse(JSON.stringify(schema)); + const parent = path.slice(-1)[0]; + let schemaKeys = Object.keys(newSchema); + const isItemWithAdditionalProperties = + parent === 'additionalProperties' && path.slice(-2)[0] === 'items' && newSchema.properties; // only "useful" for SwitchTask.Switch.Cases + if (!structuralObjectProperties.includes(parent) || isItemWithAdditionalProperties) { + if (!newSchema.type && !newSchema.oneOf && !newSchema.anyOf && !newSchema.allOf) { + // not necessary ? + newSchema.type = 'object'; + schemaKeys.push('type'); + } + if (newSchema.title) { + parentTitle = newSchema.title; + } + if ( + newSchema.title && + newSchema.type && + newSchema.type !== 'object' && + newSchema.type !== 'array' && + newSchema.title != 'RuntimeExpression' // RuntimeExpression is a string but used as its own type, we want to keep its title to build a JSON pointer later + ) { + delete newSchema.title; + schemaKeys = schemaKeys.filter((key) => key === 'title'); + } + if (path.join('/') == '#/properties/timeout') { + newSchema.title = 'WorkflowTimeout'; + } + if ( + !newSchema.title && + (!newSchema.type || newSchema.type === 'object' || newSchema.type === 'array') && // only naming object or array types + isNaN(parseInt(parent, 10)) && // it comes from a oneOf/anyOf/allOf, it should be titled manually + newSchema.items?.type !== 'string' && // if it's an array of string, it doesn't need to be named + newSchema.items?.type !== 'number' && // if it's an array of number, it doesn't need to be named + schemaKeys.filter((key) => !metadataProperties.includes(key)).length // if it's just a plain object, with nothing but a type an some description + ) { + if (parentTitle.trim()) { + const title = !isItemWithAdditionalProperties ? parent : path.includes('switch') ? 'case' : 'item'; + newSchema.title = toPascalCase(`${parentTitle} ${title}`); + } else { + newSchema.title = toPascalCase( + path + .slice(1) + .filter((part) => !structuralObjectProperties.includes(part) && !structuralArrayProperties.includes(part)) + .join(' '), + ); + } + schemaKeys.push('title'); + parentTitle = newSchema.title; + } + } + if (schema.title === 'OpenIdConnectAuthenticationProperties') { + newSchema['$id'] = 'OpenIdConnectAuthenticationProperties'; // forces json-schema-to-typescript to declare it as such instead of "OAuth2AutenthicationData1" + } + return Object.entries(newSchema).reduce((outputSchema, [key, value]: [string, any]) => { + outputSchema[key] = prepareSchema(value, [...path, key], parentTitle); + return outputSchema; + }, {} as any); +} + +/** + * Transforms the provided schema to increase its compatibility with json-schema-to-typescript, the resulting schema **will** behave differently that the input one (phase 2) + * - replaces `unevaluatedProperties` with `additionalProperties` + * - transforms inheritance via `$ref` or `additionalProperties.$ref` to `allOf.$ref` + * - removes metadata where only $ref is used + * @param schema The schema to transform + * @param path The current path of the schema relative to the original schema + * @returns A mutated schema + */ +function mutateSchema(schema: any, path: string[] = ['#']): any { + if (!isObject(schema) && !Array.isArray(schema)) { + return schema; + } + if (Array.isArray(schema)) { + return schema.map((item, i) => mutateSchema(item, [...path, i.toString()])); + } + const newSchema = JSON.parse(JSON.stringify(schema)); + const parent = path.slice(-1)[0]; + const schemaKeys = Object.keys(newSchema); + if (!structuralObjectProperties.includes(parent)) { + if (newSchema.unevaluatedProperties != null) { + newSchema.additionalProperties = newSchema.unevaluatedProperties; + delete newSchema.unevaluatedProperties; + schemaKeys[schemaKeys.indexOf('unevaluatedProperties')] = 'additionalProperties'; + } + if (newSchema['$ref']) { + if (schemaKeys.filter((key) => !metadataProperties.includes(key)).length == 1) { + // only $ref + metadataProperties.forEach((prop) => delete newSchema[prop]); + } else if (newSchema.properties) { + const $ref = { $ref: newSchema['$ref'] }; + const properties = { + properties: newSchema.properties, + } as any; + delete newSchema['$ref']; + delete newSchema.properties; + newSchema.allOf = [$ref, properties]; + } + } + } + return Object.entries(newSchema).reduce((outputSchema, [key, value]: [string, any]) => { + outputSchema[key] = mutateSchema(value, [...path, key]); + return outputSchema; + }, {} as any); +} + +/** + * Generates a TypeScript file containing type declarations that represent the structure defined in the JSON Schema + * @param srcFile The path to the JSON Schema file + * @param destFile The destination path where the generated TypeScript file will be saved + * @returns A promise that resolves when the TypeScript file has been successfully written + */ +async function generate(srcFile: string, destFile: string): Promise { + const options: Partial = { + // prefere `prepareSchema` to set a title rather than `customName` otherwise the next step (validation pointers generation) will fail + customName: (schema: JSONSchema) /*, keyNameFromDefinition: string | undefined)*/ => { + if (schema.$id?.includes('serverlessworkflow.io')) { + return 'Workflow'; + } + if (schema.$id == 'OpenIdConnectAuthenticationProperties') { + return schema.$id; + } + // don't return anything to keep the default behavior + }, + bannerComment: `${fileHeader} +${inFileDisclaimer} + + `, + style: { + singleQuote: true, + }, + //unreachableDefinitions: true, + }; + const schemaText = await readFile(srcFile, { encoding: 'utf-8' }); + let schema = prepareSchema(yaml.load(schemaText)); + await writeFile( + srcFile.replace('workflow', '__internal_workflow').replace('.yaml', '.json'), + JSON.stringify(schema, null, 2).replace('workflow.yaml', 'workflow.json'), + ); + schema = mutateSchema(schema); + //await writeFile(srcFile.replace('workflow', '__mutated_workflow'), JSON.stringify(schema, null, 2)); + const declarations = await compile(schema, 'Workflow', options); + const destDir = path.dirname(destFile); + await reset(destDir); + await writeFile(destFile, declarations); + await writeFile(path.resolve(destDir, 'index.ts'), `${fileHeader}export * as Specification from './specification';`); +} + +const srcFile = path.resolve(schemaDir, 'workflow.yaml'); +const destFile = path.resolve(definitionsDir, 'specification.ts'); + +generate(srcFile, destFile).then(console.log.bind(console)).catch(console.error.bind(console)); diff --git a/tools/3_generate-validation-pointers.ts b/tools/3_generate-validation-pointers.ts new file mode 100644 index 00000000..c9f7f4cb --- /dev/null +++ b/tools/3_generate-validation-pointers.ts @@ -0,0 +1,100 @@ +/* + * Copyright 2021-Present The Serverless Workflow Specification Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { promises as fsPromises } from 'fs'; +import * as path from 'path'; +import { fileHeader, inFileDisclaimer } from './consts'; +import { definitionsDir, isObject, reset, schemaDir, vallidationDir } from './utils'; +import { JSONSchema } from 'json-schema-to-typescript'; +import { getExportedDeclarations } from './reflection'; +import * as yaml from 'js-yaml'; + +const { writeFile, readFile } = fsPromises; + +/** + * Gets the JSON pointer of the subschema with the provided title + * @param schema The schema to get the pointer from + * @param title The title to lookup + * @param parentPath The JSON pointer of the parent schema + * @returns The JSON pointer of the subschema with the provided title, or undefined if none is found + */ +function getJsonPointer(schema: JSONSchema, title: string, parentPointer: string = '#'): string | undefined { + if (typeof schema.title === 'string' && schema.title.toLowerCase() === title.toLowerCase()) { + return parentPointer; + } + for (const [key, value] of Object.entries(schema) as [string, any]) { + if (!isObject(value) && !Array.isArray(value)) { + continue; + } + if (!Array.isArray(value)) { + const match = getJsonPointer(value, title, `${parentPointer}/${key}`); + if (match) { + return match; + } + } else { + for (let i = 0, c = value.length; i < c; i++) { + const match = getJsonPointer(value[i], title, `${parentPointer}/${key}/${i}`); + if (match) { + return match; + } + } + } + } +} + +/** + * Generates a file containing a mapping of type and their JSON pointers + * @param schemaFile The schema to get the pointers from + * @param definitionFile The definition file to get the declarations from + * @param destFile The output file + */ +async function generate(schemaFile: string, definitionFile: string, destFile: string): Promise { + const definitions = await readFile(definitionFile, { encoding: 'utf-8' }); + const schemaTxt = await readFile(schemaFile, { encoding: 'utf-8' }); + const declarations = Array.from(getExportedDeclarations(definitions).keys()) + .filter((name) => name !== 'Workflow') + .sort((a, b) => a.localeCompare(b)); + const schema = yaml.load(schemaTxt) as JSONSchema; + const baseUri = schema.$id.replace('.yaml', '.json') + '#'; + const jsonPointers = [ + ['Workflow', baseUri], + ...declarations.map((name) => [name, getJsonPointer(schema, name, baseUri)]), + ]; + const validationPointersSrc = `${fileHeader} +${inFileDisclaimer} + +/** +* A map of type names and their corresponding schema +*/ +export const validationPointers = { +${jsonPointers.reduce((src, [key, value]) => `${src} ${key}: ${value ? `'${value}'` : 'undefined'},\n`, '')} +}; + `; + const destDir = path.dirname(destFile); + await reset(destDir); + await writeFile(destFile, validationPointersSrc); + await writeFile( + path.resolve(destDir, 'index.ts'), + fileHeader + "export { validationPointers } from './validation-pointers';", + ); +} + +const schemaFile = path.resolve(schemaDir, '__internal_workflow.json'); +//const schemaFile = path.resolve(schemaDir, 'workflow.json'); +const definitionFile = path.resolve(definitionsDir, 'specification.ts'); +const destFile = path.resolve(vallidationDir, 'validation-pointers.ts'); + +generate(schemaFile, definitionFile, destFile).then(console.log.bind(console)).catch(console.error.bind(console)); diff --git a/tools/4_generate-classes.ts b/tools/4_generate-classes.ts new file mode 100644 index 00000000..1bad0f77 --- /dev/null +++ b/tools/4_generate-classes.ts @@ -0,0 +1,322 @@ +/* + * Copyright 2021-Present The Serverless Workflow Specification Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { promises as fsPromises } from 'fs'; +import * as path from 'path'; +import { fileHeader, inFileDisclaimer } from './consts'; +import { classesDir, definitionsDir, normalizeKnownAllCaps, reset, toKebabCase } from './utils'; +import { + getArrayHydration, + getExportedDeclarations, + getObjectHydration, + getTypeName, + getUnderlyingTypes, +} from './reflection'; +import { Node, Type } from 'ts-morph'; + +const { writeFile, readFile } = fsPromises; + +/** + * Returns the declaration for a class + * @param name The name of the class + * @param baseClass The inherited class, if any + * @returns The declaration of the class + */ +function getObjectClassDeclaration(name: string, node: Node, type: Type, baseClass?: string): string { + const hydrationResult = getObjectHydration(node, type); + return `${fileHeader} +${inFileDisclaimer} + +${hydrationResult.imports.map((type) => `import { _${type} } from './${toKebabCase(normalizeKnownAllCaps(type))}';`).join('\n')} +${baseClass ? `import { _${baseClass} } from './${toKebabCase(normalizeKnownAllCaps(baseClass))}';` : "import { ObjectHydrator } from '../../hydrator';"} +import { Specification } from '../definitions'; +import { getLifecycleHooks } from '../../lifecycle-hooks'; +import { validate } from '../../validation'; +${hydrationResult.code ? `import { isObject } from '../../utils';` : ''} +${ + name === 'Workflow' + ? `import * as yaml from 'js-yaml'; +import { buildGraph, Graph } from '../../graph-builder'; +import { convertToMermaidCode } from '../../mermaid-converter';` + : '' +} + +/** + * Represents the intersection between the ${name} class and type + */ +export type ${name}Intersection = ${name} & Specification.${name}; + +/** + * Represents a constructor for the intersection of the ${name} class and type + */ +export interface ${name}Constructor { + new (model?: Partial): ${name}Intersection; +} + +/** + * Represents a ${name} with methods for validation ${name === 'Workflow' ? 'normalization, and serialization.' : 'and normalization.'} + * Inherits from ObjectHydrator which provides functionality for hydrating the state based on a model. + */ +export class ${name} extends ${baseClass ? '_' + baseClass : `ObjectHydrator`} { + /** + * Instanciates a new instance of the ${name} class. + * Initializes properties based on the provided model if it is an object. + * + * @param model - Optional partial model object to initialize the ${name}. + */ + constructor(model?: Partial) { + super(model); + ${ + hydrationResult.code + ? `const self = (this as unknown) as Specification.${name} & object; + if (isObject(model)) { + ${hydrationResult.code} + }` + : '' + } + getLifecycleHooks('${name}')?.constructor?.(this); + } + + /** + * Validates the current instance of the ${name}. + * Throws if invalid. + */ + validate(workflow?: Partial) { + const copy = new ${name}(this as any) as ${name}Intersection; + validate('${name}', copy, workflow); + } + + /** + * Normalizes the current instance of the ${name}. + * Creates a copy of the ${name}, invokes normalization hooks if available, and returns the normalized copy. + * + * @returns A normalized version of the ${name} instance. + */ + normalize(): ${name} & Specification.${name} { + const copy = new ${name}(this as any) as ${name}Intersection; + return getLifecycleHooks('${name}')?.normalize?.(copy) || copy; + } + ${ + name === 'Workflow' + ? ` + static deserialize(text: string): WorkflowIntersection { + const model = yaml.load(text) as Partial; + validate('Workflow', model); + return new Workflow(model) as WorkflowIntersection; + } + + static serialize( + model: Partial, + format: 'yaml' | 'json' = 'yaml', + normalize: boolean = true, + ): string { + const workflow = new Workflow(model); + workflow.validate(); + const normalized = normalize ? workflow.normalize() : workflow; + if (format === 'json') { + return JSON.stringify(normalized); + } + return yaml.dump(normalized); + } + + static toGraph(model: Partial): Graph { + return buildGraph(model as unknown as WorkflowIntersection); + } + + static toMermaidCode(model: Partial): string { + return convertToMermaidCode(model as unknown as WorkflowIntersection); + } + + /** + * Serializes the workflow to YAML or JSON + * @param format The format, 'yaml' or 'json', default is 'yaml' + * @param normalize If the workflow should be normalized before serialization, default true + * @returns A string representation of the workflow + */ + serialize(format: 'yaml' | 'json' = 'yaml', normalize: boolean = true): string { + return Workflow.serialize(this as unknown as WorkflowIntersection, format, normalize); + } + + /** + * Creates a directed graph representation of the workflow + * @returns A directed graph of the workflow + */ + toGraph(): Graph { + return Workflow.toGraph(this as unknown as WorkflowIntersection); + } + + /** + * Generates the MermaidJS code corresponding to the workflow + * @returns The MermaidJS code + */ + toMermaidCode(): string { + return Workflow.toMermaidCode(this as unknown as WorkflowIntersection); + }` + : '' + } +} + +export const _${name} = ${name} as ${name}Constructor${ + name === 'Workflow' + ? `& { + /** + * Deserializes the provided string as a Workflow + * @param text The YAML or JSON representation of a workflow + * @returns A new Workflow instance + */ + deserialize(text: string): WorkflowIntersection; + + /** + * Serializes the provided Workflow to YAML or JSON + * @param workflow The workflow to serialize + * @param format The format, 'yaml' or 'json', default is 'yaml' + * @param normalize If the workflow should be normalized before serialization, default true + * @returns A string representation of the workflow + */ + serialize(workflow: Partial, format?: 'yaml' | 'json', normalize?: boolean): string; + + /** + * Creates a directed graph representation of the provided workflow + * @param workflow The workflow to convert + * @returns A directed graph of the provided workflow + */ + toGraph(workflow: Partial): Graph; + + /** + * Generates the MermaidJS code corresponding to the provided workflow + * @param workflow The workflow to convert + * @returns The MermaidJS code + */ + toMermaidCode(workflow: Partial): string; +}` + : '' + };`; +} + +/** + * Returns the declaration for a class that behaves like an array + * @param name The name of the class + * @param arrayTypeName The type parameter of the underlying array + * @returns The declaration of the array-like class + */ +function getArrayLikeClassDeclaration(name: string, arrayTypeName: string, type: Type): string { + const hydrationResult = getArrayHydration(type); + return `${fileHeader} +${inFileDisclaimer} + +${hydrationResult.imports.map((type) => `import { _${type} } from './${toKebabCase(normalizeKnownAllCaps(type))}';`)} +import { Specification } from '../definitions'; +import { ArrayHydrator } from '../../hydrator'; +import { getLifecycleHooks } from '../../lifecycle-hooks'; +import { validate } from '../../validation'; + + +/** + * Represents the intersection between the ${name} class and type + */ +export type ${name}Intersection = ${name} & Specification.${name}; + +/** + * Represents a constructor for the intersection of the ${name} class and type + */ +export interface ${name}Constructor { + new (model?: Array<${arrayTypeName}> | number): ${name}Intersection; +} + +/** + * Represents a collection of ${arrayTypeName}. + * Inherits from ArrayHydrator to handle array-specific hydration. + */ +export class ${name} extends ArrayHydrator<${arrayTypeName}> { + /** + * Constructs a new instance of the ${name} class. + * + * @param model - Optional parameter which can be an array of objects or a number representing the array length. + */ + constructor(model?: Array<${arrayTypeName}> | number) { + super(model); + if (Array.isArray(model)) { + ${hydrationResult.code} + } + Object.setPrototypeOf(this, Object.create(${name}.prototype)); + getLifecycleHooks('${name}')?.constructor?.(this); + } + + /** + * Validates the current instance of the ${name}. + * Throws if invalid. + */ + validate(workflow?: Partial) { + const copy = new ${name}(this); + validate('${name}', copy, workflow); + } + + /** + * Normalizes the current instance of the ${name}. + * Creates a copy of the ${name}, invokes normalization hooks if available, and returns the normalized copy. + * + * @returns A normalized version of the ${name} instance. + */ + normalize(): ${name} { + const copy = new ${name}(this); + return getLifecycleHooks('${name}')?.normalize?.(copy) || copy; + } +} + +export const _${name} = ${name} as unknown as ${name}Constructor; +//export const _${name} = ${name}; // could be exported directly, but it makes the job of building the index more straightforward as it's consistant with "object" classes +`; +} + +/** + * Generates classes + * @param definitionFile The declaration file to generate the classes from + * @param destDir The directory to save the declaration at + */ +async function generate(definitionFile: string, destDir: string): Promise { + const definitions = await readFile(definitionFile, { encoding: 'utf-8' }); + const exportedDeclarations = getExportedDeclarations(definitions); + const aliases = Array.from(exportedDeclarations.keys()).sort((a, b) => a.localeCompare(b)); + await reset(destDir); + for (const [alias, node] of exportedDeclarations) { + const exportedType = node![0].getType(); + let classDeclaration: string = ''; + if (!exportedType.isArray() && !exportedType.isTuple()) { + const baseClass = exportedType.getIntersectionTypes()?.[0]; + const baseClassName = baseClass ? getTypeName(baseClass) : undefined; + classDeclaration = getObjectClassDeclaration(alias, node![0], exportedType, baseClassName); + } else { + const arrayType = getTypeName( + exportedType.getArrayElementType() || getUnderlyingTypes(exportedType)[0], + 'Specification.', + ); + classDeclaration = getArrayLikeClassDeclaration(alias, arrayType, exportedType); + } + const destFile = path.resolve(destDir, toKebabCase(normalizeKnownAllCaps(alias)) + '.ts'); + await writeFile(destFile, classDeclaration); + } + const indexSrc = `${fileHeader} +${aliases.reduce((imports, alias) => `${imports}import { _${alias} } from './${toKebabCase(normalizeKnownAllCaps(alias))}';\n`, '')} +export const Classes = { +${aliases.reduce((exports, alias) => `${exports} ${alias}: _${alias},\n`, '')} +};`; + const destFile = path.resolve(destDir, 'index.ts'); + await writeFile(destFile, indexSrc); +} + +const definitionFile = path.resolve(definitionsDir, 'specification.ts'); + +generate(definitionFile, classesDir).then(console.log.bind(console)).catch(console.error.bind(console)); diff --git a/tools/5_generate-builders.ts b/tools/5_generate-builders.ts new file mode 100644 index 00000000..15e8bfc5 --- /dev/null +++ b/tools/5_generate-builders.ts @@ -0,0 +1,157 @@ +/* + * Copyright 2021-Present The Serverless Workflow Specification Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { promises as fsPromises } from 'fs'; +import * as path from 'path'; +import { fileHeader, inFileDisclaimer } from './consts'; +import { buildersDir, definitionsDir, normalizeKnownAllCaps, reset, toKebabCase } from './utils'; +import { getExportedDeclarations } from './reflection'; +import { Type } from 'ts-morph'; + +const { readFile, writeFile } = fsPromises; + +/** + * Transforms PascalCase into camelCase + * @para value A PascalCase string + * @returns A camelCase string + */ +function toCamelCase(value: string): string { + if (!value) return ''; + const transformable = value.trim(); + return transformable[0].toLowerCase() + transformable.slice(1); +} + +/** + * Creates an object builder for the provided type + * @param name The name type to create the builder for + */ +const getObjectBuilderDeclaration = (name: string, type: Type): string => + `${fileHeader} +${inFileDisclaimer} + +import { builder, Builder, BuildOptions } from "../../builder"; +import { Classes } from "../classes"; +import { ${name}Intersection } from '../classes/${toKebabCase(normalizeKnownAllCaps(name))}'; +import { Specification } from "../definitions"; + +/** + * The internal function used by the builder proxy to validate and return its underlying object + * @param {Specification.${name}} model The proxied object + * @param {BuildOptions} options The build options to use + * @returns {${name}Intersection} The built object + */ +function buildingFn(model: Specification.${name}, options: BuildOptions): ${name}Intersection { + const instance = new Classes.${name}(model); + if (options.validate) instance.validate(); + return (options.normalize ? instance.normalize() : instance) ${type.isTuple() ? 'as unknown ' : ''}as ${name}Intersection; +} + +/** + * A factory to create a builder proxy for the type \`${name}Intersection\` + * @returns {Builder<${name}Intersection, ${name}Intersection>} A builder for \`${name}Intersection\` + */ +export const ${toCamelCase(name)}Builder = (model?: Partial): Builder, ${name}Intersection> => builder(model, buildingFn);`; + +/** + * Creates an array builder for the provided type + * @param name The name type to create the builder for + * @param arrayTypeName The type parameter of the underlying array + */ +const getArrayBuilderDeclaration = (name: string, arrayTypeName: string): string => + `${fileHeader} +${inFileDisclaimer} + +import { arrayBuilder, ArrayBuilder, BuildOptions } from "../../builder"; +import { Classes } from "../classes"; +import { ${name}Intersection } from '../classes/${toKebabCase(normalizeKnownAllCaps(name))}'; +import { Specification } from "../definitions"; + +/** + * The internal function used by the builder proxy to validate and return its underlying array + * @param {Specification.${name}} model The proxied array + * @param {BuildOptions} options The build options to use + * @returns {${name}Intersection} The built array + */ +function buildingFn(model: Specification.${name}, options: BuildOptions): ${name}Intersection { + const instance = new Classes.${name}(model); + if (options.validate) instance.validate(); + return (options.normalize ? instance.normalize() : instance) as unknown as ${name}Intersection; +} + +/** + * A factory to create a builder proxy for the type \`${name}Intersection\` + * @returns {ArrayBuilder<${arrayTypeName}, ${name}Intersection>} A builder for \`${name}Intersection\` + */ +export const ${toCamelCase(name)}Builder = (model?: Specification.${name}): ArrayBuilder<${arrayTypeName}, ${name}Intersection> => arrayBuilder<${arrayTypeName}, ${name}Intersection>(model, buildingFn);`; + +/** + * Creates the builders index file + * @param destDir The builders directory + * @param aliases The list of types to create the index for + * @returns + */ +async function createIndex(destDir: string, aliases: string[]): Promise { + try { + const indexCode: string = + fileHeader + + aliases.reduce( + (acc, alias) => acc + `export * from './${toKebabCase(normalizeKnownAllCaps(alias)) + '-builder'}';\n`, + '', + ); + const indexFile = path.resolve(destDir, 'index.ts'); + await writeFile(indexFile, indexCode); + return Promise.resolve(); + } catch (ex) { + return Promise.reject(ex); + } +} + +/** + * Generates builders + * @param definitionFile The definition file path + * @param destDir The output directory for builders + * @returns + */ +async function generate(definitionFile: string, destDir: string): Promise { + try { + await reset(destDir); + const definitions = await readFile(definitionFile, { encoding: 'utf-8' }); + const exportedDeclarations = getExportedDeclarations(definitions); + const aliases = Array.from(exportedDeclarations.keys()).sort((a, b) => a.localeCompare(b)); + for (const [alias, node] of exportedDeclarations) { + const exportedType = node![0].getType(); + let builderDeclaration: string = ''; + if (!exportedType.isArray()) { + builderDeclaration = getObjectBuilderDeclaration(alias, exportedType); + } else { + const arrayType = exportedType + .getArrayElementTypeOrThrow() + .getText() + .replace('import("/declarations")', 'Specification'); + builderDeclaration = getArrayBuilderDeclaration(alias, arrayType); + } + const destFile = path.resolve(destDir, toKebabCase(normalizeKnownAllCaps(alias)) + '-builder.ts'); + await writeFile(destFile, builderDeclaration); + } + createIndex(destDir, aliases); + return Promise.resolve(); + } catch (ex) { + return Promise.reject(ex); + } +} + +const definitionFile = path.resolve(definitionsDir, 'specification.ts'); +generate(definitionFile, buildersDir).then(console.log.bind(console)).catch(console.error.bind(console)); diff --git a/tools/README.md b/tools/README.md new file mode 100644 index 00000000..184b2dec --- /dev/null +++ b/tools/README.md @@ -0,0 +1,146 @@ +# Tooling Architecture + +## 1. Downloader +A simple script that downloads the JSON Schema(s) from `https://serverlessworkflow.io/`. Currently, there is only one schema, but the script supports downloading referenced schemas as well for legacy reasons. As it might be useful in the future and doesn't add much complexity, it has been retained. + +> [!TIP] +> The schema(s) are saved in `src/lib/generated/schema/`, the main one being `workflow.json`.* + +## 2. Generating Types +The goal is to automatically generate TypeScript types/interfaces or classes corresponding to the specification's JSON Schema. This step is the trickiest. Its outcome will vary depending on the schema and the library used. + +Some libraries considered: +- [dtsgenerator](https://www.npmjs.com/package/dtsgenerator) - Used with the previous version of the spec but is no longer updated and doesn't support `draft/2020-12` schemas. Replacing `$defs` with `definitions` didn't yield convincing results. With the previous version, manual merging of schemas was needed because external `$refs` were not resolved. +- [quicktype](https://www.npmjs.com/package/quicktype) - Despite its popularity, its output was unsatisfactory. Instead of using union types, it merged all properties into one object and made them nullable. While there might be configuration options to address this, it was not explored in depth. Its support for many languages might make it less specialized. +- [json-schema-to-typescript](https://www.npmjs.com/package/json-schema-to-typescript) - Generates a mix of types and interfaces, using unions and intersections. A red flag is the number of open issues, some dating back to 2018. However, it is still maintained. + +In the end, `json-schema-to-typescript` was selected. Nevertheless, it has some issues to work around: +- [Issue #613](https://github.com/bcherny/json-schema-to-typescript/issues/613) +- [Issue #193](https://github.com/bcherny/json-schema-to-typescript/issues/193) (from 2018) + +To maximize compatibility with `json-schema-to-typescript`, the generator performs a few operations in two phases: + +### Phase 1: Embellishing the JSON Schema +To have better control over the generated type names, every object and array of objects in the schema is given a `title` if none is defined. This allows: +1. Avoiding names like `Schema` and `Schema1` +2. Mapping a generated type to its JSON pointer in the schema (see [3. Generating Validators](#3-generating-validators)) + +The `type: object` is also added when not specified. This doesn't impact type generation but might be useful for strict schema validation. + +Theoretically, *Phase 1* doesn't affect the validity of the schema. + +> [!TIP] +> The resulting schema is saved as `src/lib/generated/schema/__internal_workflow.json` for later use.* + +### Phase 2: Mutating the JSON Schema +`json-schema-to-typescript` has limitations, as highlighted in the issues linked above: +- When a property's type is referenced (`$ref`) and also decorated with metadata (e.g., `description`), `json-schema-to-typescript` outputs an additional type instead of using the referenced one. See [Issue #193](https://github.com/bcherny/json-schema-to-typescript/issues/193). +- When an object inherits from another using a reference (`$ref`), the parent is ignored in the generated types. See [Issue #613](https://github.com/bcherny/json-schema-to-typescript/issues/613). +- `unevaluatedProperties` seems to be ignored. + +*Phase 2* addresses these limitations by: +- Removing metadata from properties whose type is a reference. +- Replacing `$ref` inheritance with `allOf` +- Replacing `unevaluatedProperties` with `additionalProperties` + +The resulting schema is used in-memory to generate the types. The schema produced by *Phase 2* is intrinsically different from the original schema and will produce different validation results if used. **This is why this process is done in two phases instead of one, which would have been more performant.** + +After phases 1 & 2, the mutated schema is passed to `json-schema-to-typescript` and the resulting TypeScript declarations are saved to `specification.ts`. + +> [!TIP] +> The declarations are saved in `src/lib/generated/definitions/specification.ts`.* + +## 3. Generating Validators +To validate an object of type `T`, where `T` is not the root object described by the JSON Schema, we need to know the subschema's JSON pointer corresponding to `T`. The exported declarations of the TypeScript file produced in [step 2](#2-generating-types) are extracted using `ts-morph`. *(At this point, it is probably overkill; a regex could probably do the trick, but this library will be useful later on.)* For each declaration, the internal JSON Schema produced in [step 2 - Phase 1](#phase-1-embellishing-the-json-schema) is crawled to find the object with the matching title. Then, an object where the keys are the names of the types and the values are their JSON pointers is saved as `validation-pointers.ts`. + +> [!TIP] +> The validation pointers are saved in `src/lib/generated/validation/validation-pointers.ts`.* + +The produced validation pointers are used by the SDK to expose a `validate` function that takes the name of the type to validate and the object to validate: +```typescript +validate('TypeName', value); +``` + +> [!TIP] +> The validation function is located at `src/lib/validation.ts`.* + +## 4. Generating Classes +[Generating types](#2-generating-types) is already a great step, but classes have a few advantages we'd like to leverage in an SDK: +- Unlike types, they can be tested at runtime with `instanceof` +- They can carry business logic such as object hydration (for the aforementioned `instanceof` checking), validation, normalization, etc. + +### Phase 1: Declaration +The aim is to generate a class for each type/interface generated in [step 2](#2-generating-types) that shares the same property signatures. This is achieved by exploiting a TypeScript trick: declaring an internal class and then exposing it as an intersection of its constructor and its associated type (see this [StackOverflow reply](https://stackoverflow.com/questions/54207173/classes-keyof-in-typescript/54207465#54207465)). For instance, if our type is `Foo`, we can mimic a class `FooClass` using the following code: +```typescript +class FooClass { + constructor(model?: Partial) { + if (model) Object.assign(this, model); + } +} + +const _FooClass = FooClass as { + new(model?: Foo): FooClass & Specification.Foo // aka "the constructor creates an object which is both FooClass and Foo" +}; + +export const Classes = { + FooClass: _FooClass +}; + +const fooInstance = new Classes.FooClass(); +console.log(fooInstance instanceof Classes.FooClass); // true +``` + +For array types, it's a bit different. Here the challenge is to extend `Array` but enforce our prototype: +```typescript +export class Foo extends Array { + constructor(model?: Array) { + super(...(model||[])); + Object.setPrototypeOf(this, Object.create(Foo.prototype)); + } +} +``` +> [!NOTE] +> After implementing this approach, the "hydration" has been researched and implemented. During this phase, properties of a type/interface and their subtypes (union/intersection/tuple) are reflected to be recursively hydrated. We could maybe use those to declare classes properties instead of using the "cast trick". + +### Phase 2: Hydration +To hydrate the object, we rely on `ts-morph` to reflect the properties and build the hydration code. The process consists of the following steps: +- Get the target object associate type/interface and its subtypes (union/intersection/tuple) +- For each of those types, get their properties and indexed signature +- Get literal properties that can be constant and hydrate the constant if necessary +- Get properties that are not value types and hydrate the properties if necessary +- Get the indexed signature type and hydrate it if necessary + +If a property is defined in multiple subtypes with different types, it's ignore altogether and a warning is emitted. For instance, a `CallTask` is a union of specialized call task such as `CallAsyncAPI`, `CallHTTP`, ... Those types both declare a `with` property but with different signature. Therefore, its hydration is ignored at the `CallTask` level. + +In addition to the hydration, a call to the `constructor` lifecycle hook is also generated. + +### Phase 3: Validation and normalization +When generating the class, two methods will be added: +- `validate(): void` which calls, in that order, the `preValidation` lifecycle hook, the `validate` function using the pointers build in [step 3](#3-generating-validators) and the `postValidation` lifecycle hook +- `normalize(): T` which calls the the `normalize` lifecycle hook + +> [!TIP] +> The classes are saved in `src/lib/generated/classes/`.* + +> [!TIP] +> The lifecycle hooks can be found in `src/lib/hooks/`.* + +## 5. Generating Fluent Builders +One feature of the SDK is to expose fluent builders. This feature heavily relies on the builder proxy in `src/lib/builder.ts`. The generic type `Builder` reflects properties of `T` as methods and adds a `build()` method to return the built object. The proxy sets the property value when the corresponding method is called or calls a "building function" when `build()` is called. + +The generator iterates over the generated types to: +- Define a "building function" that creates an "instance of the type" (of the class that mimics the type) and validates it. +- Wrap the generic proxy into a specific one. e.g., `export const workflowBuilder = (): Builder => builder(buildingFn);`. + +The "building function" will call the `validate()` and `normalize()` methods of the class. + +> [!TIP] +> The builders are saved in `src/lib/generated/builders/`.* + +## Conclusion +With the tooling in place, we can automatically provide the required features of the SDK: +- Type checking +- Validation +- Normalization +- Typed instances +- Fluent builder \ No newline at end of file diff --git a/tools/consts.ts b/tools/consts.ts index 0b94bee5..051996f8 100644 --- a/tools/consts.ts +++ b/tools/consts.ts @@ -31,5 +31,13 @@ export const fileHeader = `/* `; +export const inFileDisclaimer = ` +/***************************************************************************************** + * + * /!\\ This file is computer generated. Any manual modification can and will be lost. /!\\ + * + *****************************************************************************************/ +`; + export const readMeDisclaimer = `# Auto generated notice This directory and its content has been generated automatically. Do not modify its content, it WILL be lost.`; diff --git a/tools/download-schemas-github.ts b/tools/download-schemas-github.ts deleted file mode 100644 index 1ca21b6d..00000000 --- a/tools/download-schemas-github.ts +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright 2021-Present The Serverless Workflow Specification Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * - * ARCHIVE: this file is not used atm - * - */ - -import fetch from 'node-fetch'; -import * as path from 'path'; -import { promises as fsPromises } from 'fs'; -import rimraf from 'rimraf'; -import yargs from 'yargs'; -import { version } from '../package.json'; -import { readMeDisclaimer } from './consts'; -const { writeFile, mkdir } = fsPromises; -const rimrafP = async (f: string): Promise => - new Promise((resolve, reject) => - rimraf(f, (err) => { - if (err) return reject(err); - resolve(); - }) - ); -/** - * Represents the links of a GitHub content item - */ -interface GithubContentItemLinks { - self: string; - git: string; - html: string; -} - -/** - * Represents the type of a GitHub content item - */ -enum GithubContentItemType { - File = 'file', - Dir = 'dir', -} - -/** - * Represents a GitHub content item - */ -interface GithubContentItem { - name: string; - path: string; - sha: string; - size: number; - url: string; - html_url: string; - git_url: string; - download_url: string; - type: GithubContentItemType; - _links: GithubContentItemLinks; -} - -/** Resets the destination directory */ -const reset = async (destDir: string) => - rimrafP(destDir) - .then(() => mkdir(destDir, { recursive: true })) - .then(() => writeFile(path.resolve(destDir, 'README.md'), readMeDisclaimer)); - -/** - * A promise that list the schemas in the registry - * @param {string} url The registry entry point - * @returns {GithubContentItem[]} The list of items - */ -const listFiles = async (url: string): Promise => - fetch(url) - .then((res: any) => { - if (res.status !== 200) throw `Cannot fetch ${url}`; - return res.json(); - }) - .then((items: GithubContentItem[]) => { - const queue = items.map((i) => { - if (i.type === GithubContentItemType.Dir) return listFiles(i.url); - return Promise.resolve([i]); - }); - return Promise.all(queue); - }) - .then((items: GithubContentItem[][]) => items.reduce((acc, i) => [...acc, ...i])); -/** - * A promise that maps the item paths and their urls - * @param {GithubContentItem[]} items The list of items - * @returns {Map} The path/url map - */ -const mapFilePaths = async (items: GithubContentItem[]): Promise> => { - const filesMap = new Map(); - items.forEach((i) => { - filesMap.set(i.path, i.download_url); - }); - return Promise.resolve(filesMap); -}; -/** - * A promise to download the file at the provided url to the provided dest - * @param {string} url The URL to get the file from - * @param {string} dest The destination path - * @returns {void} - */ -const downloadFile = async (url: string, dest: string): Promise => - mkdir(path.resolve(process.cwd(), 'src/lib', dest.split('/').slice(0, -1).join('/')), { recursive: true }) - .then(() => fetch(url)) - .then((res: any) => res.arrayBuffer()) - .then((data) => writeFile(path.resolve(process.cwd(), 'src/lib', dest), Buffer.from(data))); -/** - * A promise to download the provided files - * @param {Map} filesMap The path/url map to download to/from - * @returns {void} - */ -const downloadFiles = async (filesMap: Map): Promise => - Promise.all(Array.from(filesMap).map(([dest, url]) => downloadFile(url, dest))); - -const argv = yargs(process.argv.slice(2)).argv; -const ref = `${version.split('.').slice(0, -1).join('.')}.x`; -/** The schema registry base url, either provided in args or based on the package version */ -const registryUrl: string = - (argv.registry as string) || - `https://api.github.com/repos/serverlessworkflow/specification/contents/schema?ref=${ref}`; -console.log(`Using registry '${registryUrl}'`); -/** List, map, download */ -reset(path.resolve(process.cwd(), 'src/lib/schema')) - .then(() => listFiles(registryUrl)) - .then(mapFilePaths) - .then(downloadFiles) - .then(console.log.bind(console)) - .catch(console.error.bind(console)); diff --git a/tools/generate-builders.ts b/tools/generate-builders.ts deleted file mode 100644 index b958c8b2..00000000 --- a/tools/generate-builders.ts +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Copyright 2021-Present The Serverless Workflow Specification Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { promises as fsPromises } from 'fs'; -import * as path from 'path'; -import { fileHeader } from './consts'; -import { reset } from './utils'; -const { readFile, writeFile } = fsPromises; - -declare global { - interface String { - matchAll(re: RegExp): RegExpExecArray[]; - } -} -if (!String.prototype.matchAll) { - String.prototype.matchAll = function (re) { - const results: RegExpExecArray[] = []; - let matches: RegExpExecArray | null; - while ((matches = re.exec(this))) { - results.push(matches); - } - return results; - }; -} - -const types = ['Datacondition', 'Eventcondition', 'Events', 'Functions', 'Retries', 'Switchstate']; - -interface BuilderExtension { - import?: string; - preValidate: string; -} -/** Stores additional code that needs to be added to builders depending on their type */ -const buildersExtensions: { [key: string]: BuilderExtension } = { - Callbackstate: { - import: `import { setEndValueIfNoTransition } from '../definitions/utils';`, - preValidate: `\r\n setEndValueIfNoTransition(model);`, - }, - Delaystate: { - import: `import { setEndValueIfNoTransition } from '../definitions/utils';`, - preValidate: `\r\n setEndValueIfNoTransition(model);`, - }, - Eventstate: { - import: `import { setEndValueIfNoTransition } from '../definitions/utils';`, - preValidate: `\r\n setEndValueIfNoTransition(model);`, - }, - Foreachstate: { - import: `import { setEndValueIfNoTransition } from '../definitions/utils';`, - preValidate: `\r\n setEndValueIfNoTransition(model);`, - }, - Injectstate: { - import: `import { setEndValueIfNoTransition } from '../definitions/utils';`, - preValidate: `\r\n setEndValueIfNoTransition(model);`, - }, - Operationstate: { - import: `import { setEndValueIfNoTransition } from '../definitions/utils';`, - preValidate: `\r\n setEndValueIfNoTransition(model);`, - }, - Parallelstate: { - import: `import { setEndValueIfNoTransition } from '../definitions/utils';`, - preValidate: `\r\n setEndValueIfNoTransition(model);`, - }, - Subflowstate: { - import: `import { setEndValueIfNoTransition } from '../definitions/utils';`, - preValidate: `\r\n setEndValueIfNoTransition(model);`, - }, - Defaultdef: { - import: `import { setEndValueIfNoTransition } from '../definitions/utils';`, - preValidate: `\r\n setEndValueIfNoTransition(model);`, - }, - Error: { - import: `import { setEndValueIfNoTransition } from '../definitions/utils';`, - preValidate: `\r\n setEndValueIfNoTransition(model);`, - }, -}; - -/** - * Transforms PascalCase/camelCase/snake_case into kebab-case - * @param {string} value A string - * @param {boolean} trim If the string needs to be trimmed before transformation - * @returns A kebab-case string - */ -const toKebabCase = (value: string, trim: boolean = true): string => { - if (!value) return ''; - const transformable = trim ? value.trim() : value; - return transformable - .replace(/([A-Z])/g, '-$1') - .replace(/\s+/g, '-') - .replace(/-+/g, '-') - .replace(/_+/g, '-') - .toLowerCase(); -}; - -/** - * Transforms PascalCase into camelCase - * @param {string} value A PascalCase string - * @returns A camelCase string - */ -const toCamelCase = (value: string): string => { - if (!value) return ''; - const transformable = value.trim(); - return transformable[0].toLowerCase() + transformable.slice(1); -}; - -/** - * Creates a builder for the provided type - * @param {string} destDir The builders directory - * @param {string} dataType The type to create the builder for - * @returns {void} - */ -const createBuilder = async (destDir: string, dataType: string): Promise => { - try { - const camelType = toCamelCase(dataType); - const extension = buildersExtensions[dataType]; - const builderCode = - fileHeader + - `import { Builder, builder } from '../builder'; -import { Specification } from '../definitions'; -import { validate } from '../utils'; -${extension?.import ? extension.import : ''} - -/** - * The internal function used by the builder proxy to validate and return its underlying object - * @param {Specification.${dataType}} data The underlying object - * @returns {Specification.${dataType}} The validated underlying object - */ -function ${camelType}BuildingFn(data: Specification.${dataType}): (() => Specification.${dataType}) { - return () => { - const model = new Specification.${dataType}(data); - - ${extension?.preValidate ? extension.preValidate : ''} - - validate('${dataType}', model); - return model; - }; -} - -/** - * A factory to create a builder proxy for the type \`Specification.${dataType}\` - * @returns {Specification.${dataType}} A builder for \`Specification.${dataType}\` - */ -export function ${camelType}Builder(): Builder { - return builder(${camelType}BuildingFn); -}`; - const destFile = path.resolve(destDir, toKebabCase(camelType) + '-builder.ts'); - await writeFile(destFile, builderCode); - return Promise.resolve(); - } catch (ex) { - return Promise.reject(ex); - } -}; - -/** - * Creates the builders index file - * @param {string} destDir The builders directory - * @param {string} dataType The type to create the builders index for - * @returns {void} - */ -const createIndex = async (destDir: string, classes: string[]): Promise => { - try { - const indexCode: string = - fileHeader + - classes.reduce((acc, t) => acc + `export * from './${toKebabCase(toCamelCase(t)) + '-builder'}';\n`, ''); - const indexFile = path.resolve(destDir, 'index.ts'); - await writeFile(indexFile, indexCode); - return Promise.resolve(); - } catch (ex) { - return Promise.reject(ex); - } -}; - -/** - * Generates builders - * @param {string} source The definition file path - * @param {string} destDir The output directory for builders - * @returns {void} - */ -const generate = async (source: string, destDir: string): Promise => { - try { - await reset(destDir); - const extractor: RegExp = /export \w* (\w*)/g; - const definition: string = await readFile(source, 'utf-8'); - const classes: string[] = [...definition.matchAll(extractor)] - .map(([, type]) => type) - .filter((cl) => !types.includes(cl)); - await Promise.all(classes.map(createBuilder.bind(null, destDir))); - createIndex(destDir, classes); - return Promise.resolve(); - } catch (ex) { - return Promise.reject(ex); - } -}; - -const buildersDir = path.resolve(process.cwd(), 'src/lib/builders'); -const definitionSrc = path.resolve(process.cwd(), 'src/lib/schema/types/workflow.ts'); -generate(definitionSrc, buildersDir).then(console.log.bind(console)).catch(console.error.bind(console)); diff --git a/tools/generate-definitions.ts b/tools/generate-definitions.ts deleted file mode 100644 index b5a73d4e..00000000 --- a/tools/generate-definitions.ts +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2021-Present The Serverless Workflow Specification Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import $RefParser from '@apidevtools/json-schema-ref-parser'; -import dtsGenerator, { JsonSchema as dtsGeneratorJsonSchema, parseSchema } from 'dtsgenerator'; -import { promises as fsPromises } from 'fs'; -import * as path from 'path'; -import { fileHeader } from './consts'; -import { capitalizeFirstLetter, mergeDefinitions, mergeSchemas, reset } from './utils'; -const { writeFile } = fsPromises; - -/** - * Creates the type->path map for the ajv validators - * @param {string} dest The output path - * @param {Map} known$Refs The know references map - * @returns {void} - */ -const createValidatorsPaths = async (dest: string, known$Refs: Map, baseUrl: string): Promise => { - try { - const validatorsPathsCode = - fileHeader + - `/** -* A map of type names and their corresponding schema -*/ -export const validatorsPaths: [string, string][] = [ - ['Workflow', '${baseUrl}/workflow.json'], -${Array.from(known$Refs) - .map( - ([dataType, path]) => - ` ['${capitalizeFirstLetter(dataType)}', '${baseUrl}/${ - path.includes('.json') ? path : 'workflow.json' + path - }'],` - ) - .join('\r\n')} -]`; - const destDir = path.dirname(dest); - await reset(destDir); - await writeFile(dest, validatorsPathsCode); - } catch (ex) { - return Promise.reject(ex); - } -}; - -/** - * Generates TypeScript equivalent of the provided JSON Schema - * @param {string} source The input JSON Schema path - * @param {string} dest The output TypeScript path - * @param {string[]} additionnalSchemas Optional schemas to gather and merge definitions from - */ -const generate = async (source: string, dest: string, additionnalSchemas: string[] = []): Promise => { - try { - const $refParser = new $RefParser(); - const known$Refs = new Map(); - await $refParser.resolve(source); - const paths = [...$refParser.$refs.paths(), ...additionnalSchemas].filter( - (p, index, arr) => arr.indexOf(p) === index && p !== source - ); - await mergeDefinitions($refParser, paths, known$Refs); - mergeSchemas($refParser, known$Refs, $refParser.schema, '#/'); - let generatedTS = ( - await dtsGenerator({ - contents: [parseSchema($refParser.schema as dtsGeneratorJsonSchema)], - config: { - plugins: { - '@dtsgenerator/replace-namespace': { - map: [ - { - from: [true, true, true, true, true], - to: ['ServerlessWorkflow'], - }, - ], - }, - }, - }, - }) - ) - .replace(/WorkflowJson\.Definitions\./g, '') - .replace(/WorkflowJson/g, 'Workflow'); - const lines = generatedTS.split('\n'); - generatedTS = lines.slice(1, lines.length - 2).join('\n'); // removes 'declare namespace' and keeps 'exports'. - const destDir = path.dirname(dest); - await reset(destDir); - await writeFile(dest, fileHeader + generatedTS); - await writeFile(path.resolve(destDir, 'index.ts'), fileHeader + "export * as Specification from './workflow';"); - const validatorsDest = path.resolve(path.dirname(dest), '../validation/validators-paths.ts'); - const $id = $refParser.schema.$id; - const baseUrl = path.dirname($id); - await createValidatorsPaths(validatorsDest, known$Refs, baseUrl); - return Promise.resolve(); - } catch (ex) { - return Promise.reject(ex); - } -}; - -const srcFile = path.resolve(process.cwd(), 'src/lib/schema/workflow.json'); -const destFile = 'src/lib/schema/types/workflow.ts'; -/* -const additionnalSchemas = [ - path.resolve(process.cwd(), 'src/lib/schema/common.json'), // should be resolved already, no need to add it manually - path.resolve(process.cwd(), 'src/lib/schema/extensions/kpi.json'), // not linked by workflow, manually added -]; -generate(srcFile, destFile, additionnalSchemas) -*/ -generate(srcFile, destFile).then(console.log.bind(console)).catch(console.error.bind(console)); diff --git a/tools/reflection.ts b/tools/reflection.ts new file mode 100644 index 00000000..a37835d0 --- /dev/null +++ b/tools/reflection.ts @@ -0,0 +1,304 @@ +/* + * Copyright 2021-Present The Serverless Workflow Specification Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ExportedDeclarations, Project, QuoteKind, Type, Symbol as TsMorphSymbol, Node } from 'ts-morph'; + +/** + * Maps a property and its the type it's declared into + */ +type PropertyMap = { + /** The declaring type */ + parent: Type; + /** The property symbol */ + property: TsMorphSymbol; +}; + +/** + * Describes an object property + */ +type PropertyInfo = { + /** The property name */ + name: string; + /** The property type name */ + type: string; + /** The original ts-morph type */ + originalType: Type; + /** The original declaration */ + originalDeclaration: string; + /** The type the property belongs to */ + parentType: Type; + /** True if the property type is anonymous */ + isAnonymous: boolean; + /** True if the property type has an indexed signature */ + hasIndexedSignature: boolean; +}; + +/** The result of an hydration call */ +type HydrationResult = { + /** The list of types to import */ + imports: string[]; + /** The hydration code */ + code: string; +}; + +/** + * Get the exported declarations of the provided TypeScript code + * @param tsSource The TypeScript code to parse + * @returns An array containing the name of the exported declarations + */ +export const getExportedDeclarations = (tsSource: string): ReadonlyMap => { + const project = new Project({ + useInMemoryFileSystem: true, + manipulationSettings: { + quoteKind: QuoteKind.Single, + }, + }); + const sourceFile = project.createSourceFile('declarations.ts', tsSource); + return sourceFile.getExportedDeclarations(); +}; + +/** + * Gets a type, its union, intersection and tuple subtypes + * @param type The source type + * @returns An array containing the type and its subtypes + */ +export const getUnderlyingTypes = (type: Type): Type[] => + [ + type, + ...type.getUnionTypes().flatMap((t) => getUnderlyingTypes(t)), + ...type.getIntersectionTypes().flatMap((t) => getUnderlyingTypes(t)), + ...type.getTupleElements().flatMap((t) => getUnderlyingTypes(t)), + ].filter( + (t, idx, arr) => arr.findIndex((tt) => tt.getText() === t.getText()) === idx && !t.isArray() && !t.isTuple(), + ); + +/** + * Checks if the provided type has an indexed signature + * @param type The type to check + * @returns True if the type has an indexed signature + */ +const hasStringIndexedSignature = (type: Type): boolean => !!type.getStringIndexType(); + +/** + * Checks if the provided type is a value type or a union/intersection/tuple of value types + * @param type The type to check + * @returns True if the type, or its subtypes, is a value type + */ +const isValueType = (type: Type): boolean => + type.isString() || + type.isNumber() || + type.isBoolean() || + type.isBigInt() || + type.isEnum() || + type.isAny() || + type.isUnknown() || + type.isLiteral() || + (type.isUnion() && type.getUnionTypes().every((t) => isValueType(t))) || + (type.isIntersection() && type.getIntersectionTypes().every((t) => isValueType(t))) || + (type.isTuple() && type.getTupleElements().every((t) => isValueType(t))) || + (type.isArray() && isValueType(type.getArrayElementTypeOrThrow())) || + (type.isAnonymous() && hasStringIndexedSignature(type) && isValueType(type.getStringIndexType()!)); +/** + * Cleans the type name + * @param type The type to get the name from + * @param replacement The replacement text + * @returns The type name + */ +export const getTypeName = (type: Type, replacement: string = '') => + type.getText().replace(/import\("\/declarations"\)\./g, replacement); + +/** + * Returns the properties of the give type + * @param node The node containing the type + * @param type The type to get the properties from + * @returns An array of Symbol for the type's properties + */ +const getProperties = (node: Node, type: Type): PropertyMap[] => + getUnderlyingTypes(type) + .filter((t) => t.isObject()) + .flatMap((t) => t.getProperties().map((p) => ({ parent: t, property: p }))); + +/** + * Transforms the provided property Symbol to a PropertyInfo + * @param property The property to transform + * @param parent The type the property is declared into + * @param node The root node + * @returns The PropertyInfo for the provided property + */ +function asPropertyInfo(property: TsMorphSymbol, parent: Type, node: Node): PropertyInfo { + const name = property.getName(); + const originalType = property.getTypeAtLocation(node).getNonNullableType(); + const originalDeclaration = originalType.getText(); + const isAnonymous = originalType.isAnonymous(); + const hasIndexedSignature = hasStringIndexedSignature(originalType); + let typeTxt = ''; + if (!isAnonymous || !hasIndexedSignature) { + typeTxt = getTypeName(originalType); + } else if (hasIndexedSignature) { + typeTxt = getTypeName(originalType.getStringIndexType()!); + } + return { + name, + originalType, + originalDeclaration, + isAnonymous, + hasIndexedSignature, + type: typeTxt, + parentType: parent, + }; +} + +/** + * Gets a list of properties that could be hydrated + * @param node The node containing the type + * @param type The type to get the properties from + * @param propertiesMap The type properties + * @returns An array of hydratable PropertyInfo + */ +const getHydratableProperties = (node: Node, type: Type, propertiesMap: PropertyMap[]): PropertyInfo[] => + propertiesMap + .filter((pMap) => { + const originalType = pMap.property.getTypeAtLocation(node).getNonNullableType(); + //debugType(originalType); + return !isValueType(originalType); + }) + .map((pMap) => asPropertyInfo(pMap.property, pMap.parent, node)) + .concat( + ...getUnderlyingTypes(type) + .map((t) => t.getStringIndexType()) + .filter((t) => !!t && !isValueType(t)) + .reduce((props, t: Type) => { + props.push({ + name: '', + originalType: t, + originalDeclaration: t.getText(), + isAnonymous: t.isAnonymous(), + hasIndexedSignature: true, + type: getTypeName(t), + parentType: t, + }); + return props; + }, [] as PropertyInfo[]), + ); + +/** + * Gets a list of literal properties + * @param node The node containing the type + * @param properties The type properties + * @returns An array of literal PropertyInfo + */ +const getConstantProperties = (node: Node, properties: PropertyMap[]): PropertyInfo[] => + properties + .filter((pMap) => { + const originalType = pMap.property.getTypeAtLocation(node).getNonNullableType(); + //debugType(originalType); + return originalType.isLiteral() && (!originalType.isUnion() || !originalType.isIntersection()); + }) + .map((pMap) => asPropertyInfo(pMap.property, pMap.parent, node)); + +/** + * Gets duplicate values from an array + * @param input An array of values + * @returns An array of values that are duplicate in the input array + */ +const getDuplicateValues = (input: Array): Array => + input.filter((item, idx) => input.indexOf(item) === idx && input.lastIndexOf(item) !== idx); + +/** + * Produces the code to hydrate an object of the provided type + * @param node The node containing the type + * @param type The type to get the properties from + * @returns The code to hydrate the provided type + */ +export function getObjectHydration(node: Node, type: Type): HydrationResult { + const properties = getProperties(node, type); + const hydratableProperties = getHydratableProperties(node, type, properties); + let constantProperties = getConstantProperties(node, properties); + const duplicateConstantProperties = getDuplicateValues(constantProperties.map((p) => p.name)); + duplicateConstantProperties.forEach((name) => { + console.warn(`Found duplicate property '${name}' in '${type.getAliasSymbol()?.getName()}', ignored.`); + }); + constantProperties = constantProperties.filter((prop) => !duplicateConstantProperties.includes(prop.name)); + let namedProperties = hydratableProperties.filter((prop) => !!prop.name); + const duplicateNamedProperties = getDuplicateValues(namedProperties.map((p) => p.name)); + duplicateNamedProperties.forEach((name) => { + console.warn(`Found duplicate property '${name}' in '${type.getAliasSymbol()?.getName()}', ignored.`); + }); + namedProperties = namedProperties.filter((prop) => !duplicateNamedProperties.includes(prop.name)); + const imports: string[] = [...namedProperties.map((p) => p.type)].filter((type, i, arr) => arr.indexOf(type) === i); + const lines: string[] = [ + ...constantProperties.map((prop) => `self.${prop.name} = ${prop.type} as const;`), + ...namedProperties.map((prop) => { + const propName = !type.isUnion() ? prop.name : `${prop.name} as Specification.${prop.type}`; + const modelCast = !type.isUnion() ? 'model' : `(model as ${getTypeName(prop.parentType, 'Specification.')})`; + const selfCase = !type.isUnion() ? 'self' : `(self as ${getTypeName(prop.parentType, 'Specification.')})`; + if (!prop.isAnonymous) { + return `if (typeof ${modelCast}.${prop.name} === 'object') ${selfCase}.${prop.name} = new _${prop.type}(${modelCast}.${propName}) ${prop.originalType.isTuple() ? `as unknown as Specification.${prop.type}` : ''};`; + } + if (prop.isAnonymous) { + return `if (typeof ${modelCast}.${prop.name} === 'object') ${selfCase}.${prop.name} = Object.fromEntries( + Object.entries(${modelCast}.${propName}).map(([key, value]) => [key, new _${prop.type}(value)] ) + );`; + } + }), + ].filter((line): line is string => !!line?.trim()); + const indexedProperty = hydratableProperties.find((p) => !p.name); + if (indexedProperty && !indexedProperty.isAnonymous) { + const selfCase = !type.isUnion() ? 'self' : `(self as ${getTypeName(indexedProperty.parentType)})`; + imports.push(indexedProperty.type); + lines.push( + `const knownProperties: string[] = [${[...constantProperties, ...namedProperties].map((p) => `'${p.name}'`).join(',')}];`, + ); + lines.push(`Object.entries(model).filter(([key]) => !knownProperties.includes(key)).forEach(([key, value]) => { + ${selfCase}[key] = new _${indexedProperty.type}(value); + });`); + } + const code = lines.join('\n'); + return { + imports, + code, + }; +} + +/** + * Produces the code to hydrate an array of the provided type + * @param type The array type to hydrate + * @returns The code to hydrate the provided array + */ +export function getArrayHydration(type: Type): HydrationResult { + const arrayType = type.getArrayElementType() || getUnderlyingTypes(type)[0]; + const lines: string[] = ['if (model?.length) {', 'this.splice(0, this.length);']; + const imports: string[] = []; + if (isValueType(arrayType)) { + lines.push(`model.forEach(item => this.push(item));`); + } else if (!arrayType.isAnonymous()) { + const typeName = getTypeName(arrayType); + imports.push(typeName); + lines.push(`model.forEach(item => this.push(new _${typeName}(item)));`); + } else { + const typeName = getTypeName(arrayType.getStringIndexType()!); + imports.push(typeName); + lines.push( + `model.forEach(item => this.push(Object.fromEntries(Object.entries(item).map(([key, value]) => [key, new _${typeName}(value)]))));`, + ); + } + lines.push('}'); + const code = lines.join('\n'); + return { + imports, + code, + }; +} diff --git a/tools/utils.ts b/tools/utils.ts index c8338e80..8978a9c2 100644 --- a/tools/utils.ts +++ b/tools/utils.ts @@ -14,163 +14,90 @@ * limitations under the License. */ -import $RefParser from '@apidevtools/json-schema-ref-parser'; import { promises as fsPromises } from 'fs'; import * as path from 'path'; -import rimraf from 'rimraf'; +import { rimraf } from 'rimraf'; import { readMeDisclaimer } from './consts'; +import { URL } from 'url'; +import yargs from 'yargs'; +import { schemaVersion } from '../package.json'; + const { writeFile, mkdir } = fsPromises; -/** - * Wraps rimraf into a Promise - * @param f {string} The target to be deleted - * @returns {void} - */ -export const rimrafP = async (f: string): Promise => - new Promise((resolve, reject) => - rimraf(f, (err) => { - if (err) return reject(err); - resolve(); - }) - ); +/** Resets the destination directory, recursively deletes everything and adds the README */ +export const reset = async (destDir: string) => + rimraf(destDir) + .then(() => mkdir(destDir, { recursive: true })) + .then(() => writeFile(path.resolve(destDir, 'README.md'), readMeDisclaimer)); /** - * Capitalized the first letter of the provided string - * @param {} value The string to capitalize - * @returns {string} The capitalized string + * Check if the provided value is an object but not an array + * @param value The value to check + * @returns True if the value is an object */ -export const capitalizeFirstLetter = (value: string): string => { - if (!value) return ''; - const transformable = value.trim(); - return transformable[0].toUpperCase() + transformable.slice(1); +export const isObject = (value: unknown): boolean => { + if (!value) return false; + return typeof value === 'object' && !Array.isArray(value); }; /** - * Tells if the provided objects hold a reference to another definition - * @param {any} obj The object to test - * @returns {boolean} Returns true if the object holds a reference to another schema - */ -export const isRef = (obj: any): boolean => obj && obj.$ref && typeof obj.$ref === typeof ''; - -/** - * Tells if the provided object holds an external reference - * @param {any} obj The object to test - * @returns {boolean} Returns true if the reference hold by the object is external + * Transforms a PascalCased string or with space into a kebab-cased one + * @param source + * @returns */ -export const isRefExernal = (obj: any): boolean => obj && obj.$ref && !obj.$ref.startsWith('#'); +export const toKebabCase = (source: string): string => + source + .replace(/([A-Z])/g, ' $1') + .trim() + .replace(/\s+/g, '-') + .replace(/-+/g, '-') + .replace(/_+/g, '-') + .toLowerCase(); /** - * Gets the property name (key) in the root schema definitions for the provided ref. Used to avoid key collision - * @param {string} $ref The reference path - * @param {Map} known$Refs The know references map - * @returns {string} The corrected property name + * Converts a string to pascal case (PascalCase) + * @param source string The string to convert to pascal case + * @returns string The pascal case string */ -export const getPropName = ($ref: string, known$Refs: Map): string => { - const baseName = $ref.split('/').slice(-1)[0]; - let propName = baseName; - let variantIndex = 0; - while (known$Refs.has(propName) && known$Refs.get(propName) !== $ref) { - variantIndex++; - propName = baseName + variantIndex; - } - return propName; +export const toPascalCase = (source: string): string => { + if (!source) return ''; + return source + .replace(/-+/g, ' ') + .replace(/_+/g, ' ') + .replace(/\.+/g, ' ') + .replace(/\s+(.)(\w+)/g, ($1, $2, $3) => `${$2.toUpperCase()}${$3.toLowerCase()}`) + .replace(/\s/g, '') + .replace(/\w/, (s) => s.toUpperCase()); }; /** - * Merges the definitions founds in the schemas in path into the root schema's definitions - * @param {$RefParser} $refParser The $RefParser instance of the root schema - * @param {string[]} paths The path to the schemas containing definitions to merge - * @param {Map} known$Refs The know references map - * @param {string[]} parentPaths (internal) The previously known paths + * Normalize to capitalize first letter only convention for know accronyms, eg HTTP -> Http + * @param source + * @returns */ -export const mergeDefinitions = async ( - $refParser: $RefParser, - paths: string[], - known$Refs: Map, - parentPaths: string[] = [] -): Promise => { - try { - if (!parentPaths?.length) { - Object.keys($refParser.schema.definitions || {}).forEach((key: string) => { - if (!known$Refs.has(key)) { - known$Refs.set(key, `#/definitions/${key}`); - } - }); - parentPaths = paths; - } - await Promise.all( - paths.map(async (schemaPath: string) => { - const fileName = path.basename(schemaPath); - const schema = await $RefParser.parse(schemaPath); - Object.entries(schema.definitions || {}).forEach(([key, value]) => { - const propName = getPropName(key, known$Refs); - known$Refs.set(propName, `${fileName}#/definitions/${key}`); - $refParser.$refs.set(`#/definitions/${propName}`, value); - }); - const $schemaRefs = await $RefParser.resolve(schemaPath); - const otherPaths = $schemaRefs.paths().filter((p) => !parentPaths.includes(p)); - otherPaths.forEach((p) => parentPaths.push(p)); - await mergeDefinitions($refParser, otherPaths, known$Refs, parentPaths); - }) - ); - } catch (ex) { - return Promise.reject(ex); - } -}; +export const normalizeKnownAllCaps = (source: string): string => + source.replace('API', 'Api').replace('GRPC', 'Grpc').replace('HTTP', 'Http').replace('OAuth2', 'Oauth2'); -/** - * Merges external schemas references into the root schema definitions - * @param {$RefParser} $refParser The $RefParser instance of the root schema - * @param {Map} known$Refs The know references map - * @param {any} target The object to crawl for references - * @param {string} target$Ref The provided target reference path - */ -export const mergeSchemas = ( - $refParser: $RefParser, - known$Refs: Map, - target: any, - target$Ref: string -): void => { - const isRootDocument = target$Ref.startsWith('#'); - // todo ? handle circular refs ? - Object.entries(target) - .filter(([, value]: [string, any]) => value && typeof value === typeof {} && !ArrayBuffer.isView(value)) - .forEach(([key, value]: [string, any]) => { - if (!isRef(value) || (isRootDocument && !isRefExernal(value))) { - const newTargetRef = `${target$Ref.endsWith('/') ? target$Ref : target$Ref + '/'}${key}/`; - mergeSchemas($refParser, known$Refs, value, newTargetRef); - return; - } - if (isRefExernal(value)) { - const propName = getPropName(value.$ref, known$Refs); - if (known$Refs.has(propName)) { - value.$ref = `#/definitions/${propName}`; - return; - } - const referencedSchema = $refParser.$refs.get(value.$ref); - mergeSchemas($refParser, known$Refs, referencedSchema, value.$ref); - known$Refs.set(propName, value.$ref); - value.$ref = `#/definitions/${propName}`; - $refParser.$refs.set(`#/definitions/${propName}`, referencedSchema); - } else if (!isRootDocument) { - const document = target$Ref.split('#')[0]; - const relative$Ref = document + value.$ref; - const propName = getPropName(relative$Ref, known$Refs); - if (known$Refs.has(propName)) { - value.$ref = `#/definitions/${propName}`; - return; - } - const referencedSchema = $refParser.$refs.get(relative$Ref); - mergeSchemas($refParser, known$Refs, referencedSchema, relative$Ref); - known$Refs.set(propName, relative$Ref); - value.$ref = `#/definitions/${propName}`; - $refParser.$refs.set(`#/definitions/${propName}`, referencedSchema); - } - }); -}; +/** Schemas directory */ +export const schemaDir = path.resolve(process.cwd(), 'src/lib/generated/schema'); +/** Definitions directory */ +export const definitionsDir = path.resolve(process.cwd(), 'src/lib/generated/definitions'); +/** Vallidation directory */ +export const vallidationDir = path.resolve(process.cwd(), 'src/lib/generated/validation'); +/** Classes directory */ +export const classesDir = path.resolve(process.cwd(), 'src/lib/generated/classes'); +/** Builders directory */ +export const buildersDir = path.resolve(process.cwd(), 'src/lib/generated/builders'); -/** Resets the destination directory, recursively deletes everything and adds the README */ -export const reset = async (destDir: string) => - rimrafP(destDir) - .then(() => mkdir(destDir, { recursive: true })) - .then(() => writeFile(path.resolve(destDir, 'README.md'), readMeDisclaimer)); +const argv = yargs(process.argv.slice(2)) + .options({ + url: { type: 'string' }, + }) + .parseSync(); +/** The URL to download the schema from */ +export const yamlSchemaUrl: URL = new URL( + argv.url || `https://serverlessworkflow.io/schemas/${schemaVersion}/workflow.yaml`, +); +export const jsonSchemaUrl: URL = new URL( + argv.url || `https://serverlessworkflow.io/schemas/${schemaVersion}/workflow.json`, +); diff --git a/tsconfig.base.json b/tsconfig.base.json index 7e84fbd8..c46f6cee 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "ES2015", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ + "target": "ES2017", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ "lib": [ "ES2019", "DOM" ], /* Specify library files to be included in the compilation. */ "declaration": true, /* Generates corresponding '.d.ts' file. */