diff --git a/doc/.gitignore b/doc/.gitignore
index 4367453f3..b3fbf1bb9 100644
--- a/doc/.gitignore
+++ b/doc/.gitignore
@@ -1,3 +1,9 @@
html/
doxygen_sqlite3.db
warnings.log
+
+# Dir for bundles
+dist
+node_modules
+dist.yaml
+redoc-static.html
diff --git a/doc/.redocly.yaml b/doc/.redocly.yaml
new file mode 100644
index 000000000..47dc94ec0
--- /dev/null
+++ b/doc/.redocly.yaml
@@ -0,0 +1,14 @@
+# See https://redoc.ly/docs/cli/configuration/ for more information.
+apiDefinitions:
+ main: openapi/openapi.yaml
+lint:
+ extends:
+ - recommended
+ rules:
+ no-unused-components: warning
+referenceDocs:
+ htmlTemplate: ./index.html
+ theme:
+ colors:
+ primary:
+ main: "#32329f"
diff --git a/doc/dia/classes.dia b/doc/dia/classes.dia
deleted file mode 100644
index 2e9f1c896..000000000
Binary files a/doc/dia/classes.dia and /dev/null differ
diff --git a/doc/favicon.png b/doc/favicon.png
new file mode 100644
index 000000000..b5c1a2d8b
Binary files /dev/null and b/doc/favicon.png differ
diff --git a/doc/index.html b/doc/index.html
new file mode 100644
index 000000000..e4b850287
--- /dev/null
+++ b/doc/index.html
@@ -0,0 +1,24 @@
+
+
+
+ API Reference | ReDoc
+
+
+
+
+
+
+ {{{redocHead}}}
+
+
+ {{{redocHTML}}}
+
+
diff --git a/doc/openapi.yaml b/doc/openapi.yaml
deleted file mode 100644
index a067fc0a1..000000000
--- a/doc/openapi.yaml
+++ /dev/null
@@ -1,798 +0,0 @@
----
-openapi: '3.0.0'
-info:
- title: VILLASnode API
- version: 0.10.0
- description: 'A HTTP/REST API for controlling VILLASnode remotely without the need to restart the daemon.'
- termsOfService: 'https://www.fein-aachen.org/projects/villas-node/'
- contact:
- name: 'Steffen Vogel'
- email: svogel2@eonerc.rwth-aachen.de
- url: 'https://fein-aachen.org/contact/'
- license:
- name: GPL-v3
- url: 'https://www.gnu.org/licenses/gpl-3.0.en.html'
-externalDocs:
- url: 'https://villas.fein-aachen.org/doc/node.html'
-servers:
- - url: "https://villas.k8s.eonerc.rwth-aachen.de/api/v2"
- description: "The production API server in our EONERC OpenStack Kubernetes"
-tags:
- - name: super-node
- description: Global super-node related operations.
- - name: nodes
- description: Node related operations.
- - name: paths
- description: Path related operations.
-
-components:
- parameters:
- node-uuid:
- name: uuid
- description: A globally unique identifier for each node.
- in: path
- required: true
- schema:
- type: string
- format: uuid
-
- path-uuid:
- name: uuid
- description: A globally unique identifier for each path.
- in: path
- required: true
- schema:
- type: string
- format: uuid
-
- node-uuid-name:
- name: uuid-or-name
- description: Either a UUID or node-name
- in: path
- required: true
- schema:
- oneOf:
- - type: string
- format: uuid
- - type: string
- pattern: "[a-z0-9_-]{2,32}"
-
-paths:
- "/status":
- get:
- summary: Get the current status of the VILLASnode instance.
- tags:
- - super-node
- responses:
- '200':
- description: Success
- content:
- application/json:
- examples:
- example1:
- value:
- state: running
- version: v0.10.0
- release: 1.node_uuid_unique_debug.20201015git335440d
- build_id: v0.10.0-335440d-debug
- build_date: '20201015'
- hostname: ernie
- uuid: c9d64cc7-c6e1-4dd4-8873-126318e9d42c
- time_now: 1602765814.9240997
- time_started: 1602765814.3103526
- timezone:
- name: CEST
- offset: -3600
- dst: true
- kernel:
- sysname: Linux
- nodename: ernie
- release: 5.6.17-rt10
- version: "#5 SMP Fri Jul 10 14:02:33 CEST 2020"
- machine: x86_64
- domainname: "(none)"
- system:
- cores_configured: 28
- cores: 28
- processes: 780
- uptime: 1379600
- load:
- - 1.66259765625
- - 1.271484375
- - 1.18701171875
- ram:
- total: 269994606592
- free: 262204465152
- shared: 44191744
- buffer: 130211840
- swap:
- total: 4294963200
- free: 4294963200
- highmem:
- total: 0
- free: 0
-
- "/capabilities":
- get:
- summary: Get the capabilities of the VILLASnode instance.
- tags:
- - super-node
- responses:
- '200':
- description: Success
- content:
- application/json:
- examples:
- example1:
- value:
- hooks:
- - average
- - average
- - cast
- - decimate
- - dp
- - drop
- - dump
- - ebm
- - fix
- - gate
- - jitter_calc
- - limit_rate
- - pps_ts
- - print
- - restart
- - scale
- - shift_seq
- - shift_ts
- - skip_first
- - stats
- - ts
- node-types:
- - amqp
- - can
- - ethercat
- - example
- - exec
- - file
- - influxdb
- - kafka
- - loopback
- - loopback_internal
- - mqtt
- - ngsi
- - redis
- - shmem
- - signal
- - socket
- - stats
- - temper
- - test_rtt
- - websocket
- - zeromq
- apis:
- - capabilities
- - config
- - node
- - node/file
- - node/pause
- - node/restart
- - node/resume
- - node/start
- - node/stats
- - node/stats/reset
- - node/stop
- - nodes
- - path
- - path/start
- - path/stop
- - paths
- - restart
- - shutdown
- - status
- formats:
- - csv
- - gtnet
- - iotagent_ul
- - json
- - json.kafka
- - json.reserve
- - raw
- - tsv
- - value
- - villas.binary
- - villas.human
- - villas.web
-
- "/config":
- get:
- summary: Get the currently loaded configuration.
- tags:
- - super-node
- responses:
- '200':
- description: Success
- content:
- application/json:
- examples:
- example1:
- value:
- nodes:
- udp_node1:
- type: socket
- layer: udp
- in:
- address: '*:12000'
- signals:
- count: 8
- type: float
- out:
- address: '127.0.0.1:12001'
- web_node1:
- type: websocket
- vectorize: 2
- series:
- - label: Random walk
- unit: V
- - label: Sine
- unit: A
- - label: Rect
- unit: Var
- - label: Ramp
- unit: °C
- paths:
- - in:
- - udp_node1
- out:
- - web_node1
- hooks:
- - type: decimate
- ratio: 2
- - in:
- - web_node1
- out:
- - udp_node1
-
- "/restart":
- post:
- summary: Restart the VILLASnode instance.
- tags:
- - super-node
- requestBody:
- required: false
- content:
- application/json:
- schema:
- type: object
- properties:
- config:
- oneOf:
- - type: string
- example: "http://example.com/path/to/config.json"
- description: An optional path or URI to a new configuration file which should be loaded after restarting the node.
- - type: object
- description: An optional JSON object containing thenew configuration which should be loaded
- responses:
- '200':
- description: Success. The instance has been restarted.
- content:
- application/json:
- examples:
- example1:
- value:
- restarts: 5
- config: http://example.com/path/to/config.json
-
- "/shutdown":
- post:
- summary: Shutdown the VILLASnode instance.
- tags:
- - super-node
- responses:
- '200':
- description: Success. The instance has been shut down.
-
- "/nodes":
- get:
- summary: Get a list of all configure node instances.
- tags:
- - nodes
- responses:
- '200':
- description: Success
- content:
- application/json:
- examples:
- example1:
- value:
- - name: udp_node1
- uuid: b3df1d73-f483-f16c-5936-4ea48295615c
- state: running
- affinity: -1
- in:
- address: '*:12000'
- signals:
- count: 8
- type: float
- out:
- address: '127.0.0.1:12001'
- type: socket
- layer: udp
- - name: web_node1
- uuid: 19c84350-c83a-8a3b-224b-43fa591c8998
- state: running
- affinity: -1
- in:
- vectorize: 2
- signals:
- - type: float
- enabled: true
- name: signal0
- - type: float
- enabled: true
- name: signal1
- - type: float
- enabled: true
- name: signal2
- - type: float
- enabled: true
- name: signal3
- out:
- vectorize: 2
- signals:
- - type: float
- enabled: true
- name: signal0
- - type: float
- enabled: true
- name: signal1
- - type: float
- enabled: true
- name: signal2
- type: websocket
- vectorize: 2
- series:
- - label: Random walk
- unit: V
- - label: Sine
- unit: A
- - label: Rect
- unit: Var
- - label: Ramp
- unit: °C
-
- "/node/{uuid-or-name}":
- get:
- summary: Get the information of a specific node.
- tags:
- - nodes
- parameters:
- - $ref: '#/components/parameters/node-uuid-name'
- responses:
- '200':
- description: Success
- content:
- application/json:
- examples:
- example1:
- value:
- name: udp_node1
- uuid: b3df1d73-f483-f16c-5936-4ea48295615c
- state: running
- affinity: -1
- in:
- address: '*:12000'
- signals:
- count: 8
- type: float
- out:
- address: '127.0.0.1:12001'
- type: socket
- layer: udp
- '404':
- description: Error. There is no node with the given UUID or the node does not collect statistics.
-
- "/node/{uuid-or-name}/stats":
- get:
- summary: Get the statistics of a node.
- tags:
- - nodes
- parameters:
- - $ref: "#/components/parameters/node-uuid-name"
- responses:
- '200':
- description: Success
- content:
- application/json:
- examples:
- example1:
- value:
- rtp.jitter:
- low: 1.3293196e-316
- high: 0
- total: 0
- rtp.pkts_lost:
- low: 1.3285797e-316
- high: 1.3290532e-316
- total: 0
- rtp.loss_fraction:
- low: 3.0e-323
- high: 1.32907453e-316
- total: 0
- age:
- low: 1.3288619e-316
- high: 1.32909588e-316
- total: 0
- owd:
- low: 3.0e-323
- high: 3.0e-322
- total: 144
- higher: 0
- lower: 0
- highest: 0.099986117
- lowest: 0.09990915800000001
- mean: 0.09998063221527778
- variance: 7.736879555478282e-11
- stddev: 8.795953362472019e-06
- buckets:
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- gap_received:
- low: 0
- high: 1.32743107e-316
- total: 144
- higher: 0
- lower: 0
- highest: 0.10000411000000001
- lowest: 0.09999650900000001
- mean: 0.09999998652777778
- variance: 5.701784607620545e-13
- stddev: 7.551016228045431e-07
- buckets:
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- gap_sent:
- low: 1.58e-321
- high: 1.3292848e-316
- total: 144
- higher: 0
- lower: 0
- highest: 0.10004273400000001
- lowest: 0.09926839700000001
- mean: 0.09999436691666665
- variance: 3.7637473716438304e-09
- stddev: 6.134938770390321e-05
- buckets:
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- - 0
- reordered:
- low: 8.28904606e-315
- high: 1.32930615e-316
- total: 0
- skipped:
- low: 1.32879865e-316
- high: 1.3293275e-316
- total: 0
- '404':
- description: Error. There is no node with the given UUID or the node does not collect statistics.
-
- "/node/{uuid-or-name}/stats/reset":
- post:
- summary: Reset the statistics counters for a specific node.
- tags:
- - nodes
- parameters:
- - $ref: "#/components/parameters/node-uuid-name"
- responses:
- '200':
- description: Success. The statistics of the node have been reset.
- '404':
- description: Error. There is no node with the given UUID.
-
- "/node/{uuid-or-name}/start":
- post:
- summary: Start a node.
- tags:
- - nodes
- parameters:
- - $ref: "#/components/parameters/node-uuid-name"
- responses:
- '200':
- description: Success. The node has been started.
- '404':
- description: Error. There is no node with the given UUID.
-
- "/node/{uuid-or-name}/stop":
- post:
- summary: Stop a node.
- tags:
- - nodes
- parameters:
- - $ref: "#/components/parameters/node-uuid-name"
- responses:
- '200':
- description: Success. The node has been stopped.
- '404':
- description: Error. There is no node with the given UUID.
-
- "/node/{uuid-or-name}/pause":
- post:
- summary: Pause a node.
- tags:
- - nodes
- parameters:
- - $ref: "#/components/parameters/node-uuid-name"
- responses:
- '200':
- description: Success. The node has been paused.
- '404':
- description: Error. There is no node with the given UUID.
-
- "/node/{uuid-or-name}/resume":
- post:
- summary: Resume a node.
- tags:
- - nodes
- parameters:
- - $ref: "#/components/parameters/node-uuid-name"
- responses:
- '200':
- description: Success. The node has been resumed.
- '404':
- description: Error. There is no node with the given UUID.
-
- "/node/{uuid-or-name}/restart":
- post:
- summary: Retart a node.
- tags:
- - nodes
- parameters:
- - $ref: "#/components/parameters/node-uuid-name"
- responses:
- '200':
- description: Success. The node has been restarted.
- '404':
- description: Error. There is no node with the given UUID.
-
- "/node/{uuid-or-name}/file/rewind":
- post:
- summary: Rewind the playback file to the beginning.
- tags:
- - nodes
- parameters:
- - $ref: "#/components/parameters/node-uuid-name"
- responses:
- '200':
- description: Success. The file has been rewound.
- '404':
- description: Error. There is no node with the given UUID.
-
- "/node/{uuid-or-name}/file/seek":
- post:
- summary: Rewind the playback file to the beginning.
- tags:
- - nodes
- parameters:
- - $ref: "#/components/parameters/node-uuid-name"
- requestBody:
- description: Sample position in file
- required: true
- content:
- application/json:
- schema:
- type: object
- required:
- - position
- properties:
- position:
- type: integer
- example: 123
- description: Skip the first nth samples in the file.
- responses:
- '200':
- description: Success. The read-pointer of the file has been changed.
- '404':
- description: Error. There is no node with the given UUID.
-
- "/paths":
- get:
- summary: Get a list of all paths.
- tags:
- - paths
- responses:
- '200':
- description: Success
- content:
- application/json:
- examples:
- example1:
- value:
- - uuid: 251c99af-4b05-9de4-367e-2bb550412e56
- state: running
- mode: any
- enabled: true
- builtin: true
- reverse: false
- original_sequence_no: true
- last_sequence: false
- poll: false
- queuelen: 1024
- signals: []
- hooks: []
- in:
- - udp_node1
- out:
- - web_node1
- - uuid: 61b5674b-95fa-b35f-bff8-c877acf21e3b
- state: running
- mode: any
- enabled: true
- builtin: true
- reverse: false
- original_sequence_no: true
- last_sequence: false
- poll: false
- queuelen: 1024
- signals: []
- hooks: []
- in:
- - web_node1
- out:
- - udp_node1
-
- "/path/{uuid}":
- post:
- summary: Get details of a single path.
- tags:
- - paths
- parameters:
- - $ref: "#/components/parameters/path-uuid"
- responses:
- '200':
- description: Success
- content:
- application/json:
- examples:
- example1:
- value:
- uuid: 251c99af-4b05-9de4-367e-2bb550412e56
- state: running
- mode: any
- enabled: true
- builtin: true
- reverse: false
- original_sequence_no: true
- last_sequence: false
- poll: false
- queuelen: 1024
- signals: []
- hooks: []
- in:
- - udp_node1
- out:
- - web_node1
- '404':
- description: Error. There is no path with the given UUID.
-
- "/path/{uuid}/start":
- post:
- summary: Start a path.
- tags:
- - paths
- parameters:
- - $ref: "#/components/parameters/path-uuid"
- responses:
- '200':
- description: Success. The path has been started.
- '404':
- description: Error. There is no path with the given UUID.
-
- "/path/{uuid}/stop":
- post:
- summary: Start a path.
- tags:
- - paths
- parameters:
- - $ref: "#/components/parameters/path-uuid"
- responses:
- '200':
- description: Success. The path has been stopped.
- '404':
- description: Error. There is no path with the given UUID.
-
- "/graph.{format}":
- get:
- summary: Get a graph representation of the currently loaded configuration.
- tags:
- - super-node
- parameters:
- - in: path
- name: format
- schema:
- type: string
- description: The image format of the generated graph.
- enum:
- - ps
- - eps
- - txt
- - svg
- - svgz
- - gif
- - png
- - jpg
- - jpeg
- - bmp
- - dot
- - fig
- - json
- - pdf
- - in: query
- name: layout
- schema:
- type: string
- description: The Graphviz layout engine used for rendering the graph.
- enum:
- - circo
- - dot
- - fdp
- - neato
- - nop
- - nop1
- - nop2
- - osage
- - patchwork
- - sfdp
- - twopi
diff --git a/doc/openapi/README.md b/doc/openapi/README.md
new file mode 100644
index 000000000..ae48cf097
--- /dev/null
+++ b/doc/openapi/README.md
@@ -0,0 +1,13 @@
+## The `openapi` folder
+
+This folder contains your entrypoint `openapi.yaml`.
+
+That file contains references to the entire API definition.
+
+Here are some sections to pay attention to:
+
+* Top-level **description**: this accepts markdown, and Redoc and Redocly API Reference will render it at the top of the docs. Consider maintaining your markdown in a separate file and [embedding it](https://redoc.ly/docs/api-reference-docs/embedded-markdown/). Note to Redoc community edition users, the special tags are only available to the Redocly API Reference users, but you can still embed markdown.
+* Security schemes: you will define the scheme(s) your API uses for security (eg OAuth2, API Key, etc...). The security schemes are used by the Redocly API Reference "Try It" API console feature.
+* [Paths](paths/README.md): this defines each endpoint. A path can have one operation per http method.
+* Tags: it's a good idea to organize each operation. Each tag can have a description. The description is used as a section description within the reference docs.
+* Servers: a list of your servers, each with a URL.
diff --git a/doc/openapi/components/README.md b/doc/openapi/components/README.md
new file mode 100644
index 000000000..26eaeb5d5
--- /dev/null
+++ b/doc/openapi/components/README.md
@@ -0,0 +1,14 @@
+Reusable components
+===========
+
+* You can create the following folders here:
+ - `schemas` - reusable [Schema Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#schemaObject)
+ - `responses` - reusable [Response Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#responseObject)
+ - `parameters` - reusable [Parameter Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#parameterObject)
+ - `examples` - reusable [Example Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#exampleObject)
+ - `headers` - reusable [Header Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#headerObject)
+ - `requestBodies` - reusable [Request Body Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#requestBodyObject)
+ - `links` - reusable [Link Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#linkObject)
+ - `callbacks` - reusable [Callback Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#callbackObject)
+ - `securitySchemes` - reusable [Security Scheme Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#securitySchemeObject)
+* Filename of files inside the folders represent component name, e.g. `Customer.yaml`
diff --git a/doc/openapi/components/parameters/node-uuid-name.yaml b/doc/openapi/components/parameters/node-uuid-name.yaml
new file mode 100644
index 000000000..5494e3152
--- /dev/null
+++ b/doc/openapi/components/parameters/node-uuid-name.yaml
@@ -0,0 +1,10 @@
+name: uuid-or-name
+description: Either a UUID or node-name
+in: path
+required: true
+schema:
+ oneOf:
+ - type: string
+ format: uuid
+ - type: string
+ pattern: '[a-z0-9_-]{2,32}'
diff --git a/doc/openapi/components/parameters/node-uuid.yaml b/doc/openapi/components/parameters/node-uuid.yaml
new file mode 100644
index 000000000..e0499f60c
--- /dev/null
+++ b/doc/openapi/components/parameters/node-uuid.yaml
@@ -0,0 +1,7 @@
+name: uuid
+description: A globally unique identifier for each node.
+in: path
+required: true
+schema:
+ type: string
+ format: uuid
diff --git a/doc/openapi/components/parameters/path-uuid.yaml b/doc/openapi/components/parameters/path-uuid.yaml
new file mode 100644
index 000000000..3423a9eb4
--- /dev/null
+++ b/doc/openapi/components/parameters/path-uuid.yaml
@@ -0,0 +1,7 @@
+name: uuid
+description: A globally unique identifier for each path.
+in: path
+required: true
+schema:
+ type: string
+ format: uuid
diff --git a/doc/openapi/components/schemas/config.yaml b/doc/openapi/components/schemas/config.yaml
new file mode 100644
index 000000000..1db1b9625
--- /dev/null
+++ b/doc/openapi/components/schemas/config.yaml
@@ -0,0 +1,39 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+title: VILLASnode configuration file
+description: Schema of the VILLASnode configuration file.
+
+allOf:
+- type: object
+ required:
+ - nodes
+
+ additionalProperties: false
+
+ properties:
+ nodes:
+ type: object
+ title: Node list
+ description: |
+ A list of nodes to/from which this instance sends/receives sample data.
+ additionalProperties:
+ x-additionalPropertiesName: node-name
+ $ref: ./config/node.yaml
+
+ paths:
+ title: Path list
+ description: |
+ A list of uni-directional paths which connect the nodes defined in the `nodes` list.
+ type: array
+ default: []
+ items:
+ $ref: config/path.yaml
+
+ http:
+ $ref: config/http.yaml
+
+ logging:
+ $ref: config/logging.yaml
+
+- $ref: config/global.yaml
diff --git a/doc/openapi/components/schemas/config/format.yaml b/doc/openapi/components/schemas/config/format.yaml
new file mode 100644
index 000000000..fc4872938
--- /dev/null
+++ b/doc/openapi/components/schemas/config/format.yaml
@@ -0,0 +1,30 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+type: object
+
+required:
+- type
+
+properties:
+ type:
+ type: string
+
+discriminator:
+ propertyName: type
+ mapping:
+ csv: formats/csv.yaml
+ iotagent_ul: formats/iotagent_ul.yaml
+ json: formats/json.yaml
+ json.reserve: formats/json_reserve.yaml
+ json.kafka: formats/json_kafka.yaml
+ json.edgeflex: formats/json_edgeflex.yaml
+ gtnet: formats/gtnet.yaml
+ protobuf: formats/protobuf.yaml
+ raw: formats/raw.yaml
+ tsv: formats/tsv.yaml
+ value: formats/value.yaml
+ villas.binary: formats/villas_binary.yaml
+ villas.human: formats/villas_human.yaml
+ villas.web: formats/villas_web.yaml
diff --git a/doc/openapi/components/schemas/config/formats/column.yaml b/doc/openapi/components/schemas/config/formats/column.yaml
new file mode 100644
index 000000000..f2011c967
--- /dev/null
+++ b/doc/openapi/components/schemas/config/formats/column.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: line.yaml
+- type: object
+ properties:
+ delimiter:
+ type: string
diff --git a/doc/openapi/components/schemas/config/formats/csv.yaml b/doc/openapi/components/schemas/config/formats/csv.yaml
new file mode 100644
index 000000000..3e53d16b7
--- /dev/null
+++ b/doc/openapi/components/schemas/config/formats/csv.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: column.yaml
+- type: object
+ properties:
+ delimiter:
+ type: string
diff --git a/doc/openapi/components/schemas/config/formats/gtnet.yaml b/doc/openapi/components/schemas/config/formats/gtnet.yaml
new file mode 100644
index 000000000..71ce22a47
--- /dev/null
+++ b/doc/openapi/components/schemas/config/formats/gtnet.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: raw.yaml
+- type: object
+ properties:
+ delimiter:
+ type: string
diff --git a/doc/openapi/components/schemas/config/formats/iotagent_ul.yaml b/doc/openapi/components/schemas/config/formats/iotagent_ul.yaml
new file mode 100644
index 000000000..1047027b5
--- /dev/null
+++ b/doc/openapi/components/schemas/config/formats/iotagent_ul.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../format.yaml
+- type: object
+ properties:
+ delimiter:
+ type: string
diff --git a/doc/openapi/components/schemas/config/formats/json.yaml b/doc/openapi/components/schemas/config/formats/json.yaml
new file mode 100644
index 000000000..1047027b5
--- /dev/null
+++ b/doc/openapi/components/schemas/config/formats/json.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../format.yaml
+- type: object
+ properties:
+ delimiter:
+ type: string
diff --git a/doc/openapi/components/schemas/config/formats/json_edgeflex.yaml b/doc/openapi/components/schemas/config/formats/json_edgeflex.yaml
new file mode 100644
index 000000000..11d42f3e4
--- /dev/null
+++ b/doc/openapi/components/schemas/config/formats/json_edgeflex.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: json.yaml
+- type: object
+ properties:
+ delimiter:
+ type: string
diff --git a/doc/openapi/components/schemas/config/formats/json_kafka.yaml b/doc/openapi/components/schemas/config/formats/json_kafka.yaml
new file mode 100644
index 000000000..11d42f3e4
--- /dev/null
+++ b/doc/openapi/components/schemas/config/formats/json_kafka.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: json.yaml
+- type: object
+ properties:
+ delimiter:
+ type: string
diff --git a/doc/openapi/components/schemas/config/formats/json_reserve.yaml b/doc/openapi/components/schemas/config/formats/json_reserve.yaml
new file mode 100644
index 000000000..11d42f3e4
--- /dev/null
+++ b/doc/openapi/components/schemas/config/formats/json_reserve.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: json.yaml
+- type: object
+ properties:
+ delimiter:
+ type: string
diff --git a/doc/openapi/components/schemas/config/formats/line.yaml b/doc/openapi/components/schemas/config/formats/line.yaml
new file mode 100644
index 000000000..6cc9b6588
--- /dev/null
+++ b/doc/openapi/components/schemas/config/formats/line.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../format.yaml
+ - type: object
+ properties:
+ separator:
+ type: string
diff --git a/doc/openapi/components/schemas/config/formats/protobuf.yaml b/doc/openapi/components/schemas/config/formats/protobuf.yaml
new file mode 100644
index 000000000..1047027b5
--- /dev/null
+++ b/doc/openapi/components/schemas/config/formats/protobuf.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../format.yaml
+- type: object
+ properties:
+ delimiter:
+ type: string
diff --git a/doc/openapi/components/schemas/config/formats/raw.yaml b/doc/openapi/components/schemas/config/formats/raw.yaml
new file mode 100644
index 000000000..1047027b5
--- /dev/null
+++ b/doc/openapi/components/schemas/config/formats/raw.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../format.yaml
+- type: object
+ properties:
+ delimiter:
+ type: string
diff --git a/doc/openapi/components/schemas/config/formats/tsv.yaml b/doc/openapi/components/schemas/config/formats/tsv.yaml
new file mode 100644
index 000000000..3e53d16b7
--- /dev/null
+++ b/doc/openapi/components/schemas/config/formats/tsv.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: column.yaml
+- type: object
+ properties:
+ delimiter:
+ type: string
diff --git a/doc/openapi/components/schemas/config/formats/value.yaml b/doc/openapi/components/schemas/config/formats/value.yaml
new file mode 100644
index 000000000..1047027b5
--- /dev/null
+++ b/doc/openapi/components/schemas/config/formats/value.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../format.yaml
+- type: object
+ properties:
+ delimiter:
+ type: string
diff --git a/doc/openapi/components/schemas/config/formats/villas_binary.yaml b/doc/openapi/components/schemas/config/formats/villas_binary.yaml
new file mode 100644
index 000000000..1047027b5
--- /dev/null
+++ b/doc/openapi/components/schemas/config/formats/villas_binary.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../format.yaml
+- type: object
+ properties:
+ delimiter:
+ type: string
diff --git a/doc/openapi/components/schemas/config/formats/villas_human.yaml b/doc/openapi/components/schemas/config/formats/villas_human.yaml
new file mode 100644
index 000000000..f2011c967
--- /dev/null
+++ b/doc/openapi/components/schemas/config/formats/villas_human.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: line.yaml
+- type: object
+ properties:
+ delimiter:
+ type: string
diff --git a/doc/openapi/components/schemas/config/formats/villas_web.yaml b/doc/openapi/components/schemas/config/formats/villas_web.yaml
new file mode 100644
index 000000000..9a9c1d39c
--- /dev/null
+++ b/doc/openapi/components/schemas/config/formats/villas_web.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: villas_binary.yaml
+- type: object
+ properties:
+ delimiter:
+ type: string
diff --git a/doc/openapi/components/schemas/config/formatspec.yaml b/doc/openapi/components/schemas/config/formatspec.yaml
new file mode 100644
index 000000000..8b59aee83
--- /dev/null
+++ b/doc/openapi/components/schemas/config/formatspec.yaml
@@ -0,0 +1,20 @@
+---
+
+oneOf:
+- $ref: format.yaml
+- type: string
+ enum:
+ - csv
+ - gtnet
+ - iotagent_ul
+ - json
+ - json.edgeflex
+ - json.kafka
+ - json.reserve
+ - protobuf
+ - raw
+ - tsv
+ - value
+ - villas.binary
+ - villas.human
+ - villas.web
diff --git a/doc/openapi/components/schemas/config/global.yaml b/doc/openapi/components/schemas/config/global.yaml
new file mode 100644
index 000000000..faf8660f9
--- /dev/null
+++ b/doc/openapi/components/schemas/config/global.yaml
@@ -0,0 +1,69 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+type: object
+
+properties:
+
+ hugepages:
+ type: integer
+ default: 100
+ title: Number of reserved hugepages
+ description: |
+ The number of hugepages which will be reservered by the system.
+
+ See: https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt
+
+ A value of zero will disable the use of huge pages.
+
+ stats:
+ type: number
+ default: 1.0
+ title: Statistics interval
+ description: |
+ Specifies the rate at which statistics about the active paths will be periodically printed to the screen.
+
+ Setting this value to 5, will print 5 lines per second.
+
+ A line includes information such as:
+
+ - Source and Destination of path
+ - Messages received
+ - Messages sent
+ - Messages dropped
+
+ affinity:
+ type: integer
+ default: 0
+ title: Task/Process affinity mask
+ description: |
+ Restricts the exeuction of the daemon to certain CPU cores.
+ This technique, also called 'pinning', improves the determinism of the server by isolating the daemon processes on exclusive cores.
+
+ A value of `0` will not change the affinity of the process.
+
+ priority:
+ type: integer
+ default: 0
+ description: |
+ Adjusts the scheduling priority of the deamon processes.
+ By default, the daemon uses a real-time optimized FIFO scheduling algorithm.
+
+ A value of `0` will not change the priority of the process.
+
+ idle_stop:
+ type: boolean
+ default: false
+
+ uuid:
+ type: string
+ format: uuid
+ title: Super-node UUID
+ default: 'randomly generated'
+ description: |
+ Each VILLASnode instance is identified by a globally unique indentifier / UUID.
+
+ This UUID can be queried by the API.
+
+ If the setting is not provided, a UUID will be generated by hashing the active VILLASnode configuration.
+ This ensures that restarting the VILLASnode instance with the identical configuration will yield always the same UUID.
diff --git a/doc/openapi/components/schemas/config/hook.yaml b/doc/openapi/components/schemas/config/hook.yaml
new file mode 100644
index 000000000..ac9496072
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hook.yaml
@@ -0,0 +1,48 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+type: object
+
+title: Hook
+
+required:
+- type
+
+properties:
+ type:
+ type: string
+
+ enabled:
+ type: boolean
+ default: true
+
+ priority:
+ type: integer
+
+discriminator:
+ propertyName: type
+ mapping:
+ average: hooks/average.yaml
+ cast: hooks/cast.yaml
+ decimate: hooks/decimate.yaml
+ dp: hooks/dp.yaml
+ dump: hooks/dump.yaml
+ ebm: hooks/ebm.yaml
+ fix: hooks/fix.yaml
+ gate: hooks/gate.yaml
+ jitter_calc: hooks/jitter_calc.yaml
+ limit_rate: hooks/limit_rate.yaml
+ limit_value: hooks/limit_value.yaml
+ lua: hooks/lua.yaml
+ ma: hooks/ma.yaml
+ pmu_dft: hooks/pmu_dft.yaml
+ pps_ts: hooks/pps_ts.yaml
+ print: hooks/print.yaml
+ restart: hooks/restart.yaml
+ rms: hooks/rms.yaml
+ scale: hooks/scale.yaml
+ shift_seq: hooks/shift_seq.yaml
+ shift_ts: hooks/shift_ts.yaml
+ skip_first: hooks/skip_first.yaml
+ stats: hooks/stats.yaml
+ ts: hooks/ts.yaml
diff --git a/doc/openapi/components/schemas/config/hooklist.yaml b/doc/openapi/components/schemas/config/hooklist.yaml
new file mode 100644
index 000000000..210d73cdd
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooklist.yaml
@@ -0,0 +1,36 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+type: array
+items:
+ oneOf:
+ - $ref: hook.yaml
+ - type: string
+ title: Hook Name
+ description: Only the hook type is provided. No other settings can be configured.
+ enum:
+ - average
+ - cast
+ - decimate
+ - dp
+ - drop
+ - dump
+ - ebm
+ - fix
+ - gate
+ - jitter_calc
+ - limit_rate
+ - limit_value
+ - lua
+ - ma
+ - pmu_dft
+ - pps_ts
+ - print
+ - restart
+ - rms
+ - scale
+ - shift_seq
+ - shift_ts
+ - skip_first
+ - stats
+ - ts
diff --git a/doc/openapi/components/schemas/config/hooks/average.yaml b/doc/openapi/components/schemas/config/hooks/average.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/average.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/cast.yaml b/doc/openapi/components/schemas/config/hooks/cast.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/cast.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/decimate.yaml b/doc/openapi/components/schemas/config/hooks/decimate.yaml
new file mode 100644
index 000000000..f9338f109
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/decimate.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+allOf:
+- $ref: ../hook.yaml
+- type: object
+ properties:
+ ratio:
+ type: integer
+
\ No newline at end of file
diff --git a/doc/openapi/components/schemas/config/hooks/dp.yaml b/doc/openapi/components/schemas/config/hooks/dp.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/dp.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/drop.yaml b/doc/openapi/components/schemas/config/hooks/drop.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/drop.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/dump.yaml b/doc/openapi/components/schemas/config/hooks/dump.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/dump.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/ebm.yaml b/doc/openapi/components/schemas/config/hooks/ebm.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/ebm.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/fix.yaml b/doc/openapi/components/schemas/config/hooks/fix.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/fix.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/gate.yaml b/doc/openapi/components/schemas/config/hooks/gate.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/gate.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/jitter_calc.yaml b/doc/openapi/components/schemas/config/hooks/jitter_calc.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/jitter_calc.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/limit_rate.yaml b/doc/openapi/components/schemas/config/hooks/limit_rate.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/limit_rate.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/limit_value.yaml b/doc/openapi/components/schemas/config/hooks/limit_value.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/limit_value.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/lua.yaml b/doc/openapi/components/schemas/config/hooks/lua.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/lua.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/ma.yaml b/doc/openapi/components/schemas/config/hooks/ma.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/ma.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/pmu_dft.yaml b/doc/openapi/components/schemas/config/hooks/pmu_dft.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/pmu_dft.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/pps_ts.yaml b/doc/openapi/components/schemas/config/hooks/pps_ts.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/pps_ts.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/print.yaml b/doc/openapi/components/schemas/config/hooks/print.yaml
new file mode 100644
index 000000000..6a04e7410
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/print.yaml
@@ -0,0 +1,11 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+allOf:
+- $ref: ../hook.yaml
+- type: object
+ properties:
+ prefix:
+ type: string
+ default: ''
+
\ No newline at end of file
diff --git a/doc/openapi/components/schemas/config/hooks/restart.yaml b/doc/openapi/components/schemas/config/hooks/restart.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/restart.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/rms.yaml b/doc/openapi/components/schemas/config/hooks/rms.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/rms.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/scale.yaml b/doc/openapi/components/schemas/config/hooks/scale.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/scale.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/shift_seq.yaml b/doc/openapi/components/schemas/config/hooks/shift_seq.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/shift_seq.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/shift_ts.yaml b/doc/openapi/components/schemas/config/hooks/shift_ts.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/shift_ts.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/skip_first.yaml b/doc/openapi/components/schemas/config/hooks/skip_first.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/skip_first.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/stats.yaml b/doc/openapi/components/schemas/config/hooks/stats.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/stats.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/hooks/ts.yaml b/doc/openapi/components/schemas/config/hooks/ts.yaml
new file mode 100644
index 000000000..0e6e19078
--- /dev/null
+++ b/doc/openapi/components/schemas/config/hooks/ts.yaml
@@ -0,0 +1,8 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+ - $ref: ../hook.yaml
+ - type: object
+ properties: {}
diff --git a/doc/openapi/components/schemas/config/http.yaml b/doc/openapi/components/schemas/config/http.yaml
new file mode 100644
index 000000000..c1c78a50d
--- /dev/null
+++ b/doc/openapi/components/schemas/config/http.yaml
@@ -0,0 +1,23 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+type: object
+properties:
+ port:
+ type: integer
+ default: 80
+ title: Listening port
+ description: |
+ Listening port for HTTP connections.
+
+ ssl_cert:
+ type: string
+ title: SSL Certificate Path
+ description: Path to an SSL certificate
+ example: /etc/ssl/certs/mycert.pem
+
+ ssl_private_key:
+ type: string
+ title: SSL Private Key Path
+ description: Path to an SSL private key
+ example: /etc/ssl/private/mykey.pem
diff --git a/doc/openapi/components/schemas/config/logging.yaml b/doc/openapi/components/schemas/config/logging.yaml
new file mode 100644
index 000000000..45c7a4a68
--- /dev/null
+++ b/doc/openapi/components/schemas/config/logging.yaml
@@ -0,0 +1,70 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+type: object
+title: Logging configuration
+properties:
+
+ level:
+ title: The log level
+ description: |
+ This setting expects one of the allowed strings to adjust the logging level.
+ Use this with care! Producing a lot of IO by enabling the debug output might decrease the performance of the server.
+
+ type: string
+ default: info
+ enum:
+ - trace
+ - debug
+ - info
+ - warning
+ - error
+ - critical
+ - 'off'
+
+ file:
+ type: string
+ title: Log file name
+ description: |
+ Write all log messages to a file.
+
+ syslog:
+ type: boolean
+ default: false
+ title: Enable syslog logging
+ description: |
+ If enabled VILLASnode will log to the [system log](https://en.wikipedia.org/wiki/Syslog).
+
+ expressions:
+ title: Logging expressions
+ description: |
+ The logging expression allow for a fine grained control of log levels per individual logger instance.
+ Expressions are provided as a list of logger name pattern and the desired level.
+
+ **Note:** The expressions are evaluated in the order of their appearance in the list.
+
+ type: array
+ items:
+ type: object
+ required:
+ - name
+ - level
+ properties:
+ name:
+ type: string
+ title: Logger name filter
+ description:
+ The [glob](https://man7.org/linux/man-pages/man7/glob.7.html)-style pattern to match the names of the loggers for which the level should be adjusted.
+ level:
+ type: string
+ title: Log level
+ description: |
+ The level which should be used for the matched loggers.
+ enum:
+ - trace
+ - debug
+ - info
+ - warning
+ - error
+ - critical
+ - 'off'
diff --git a/doc/openapi/components/schemas/config/netem.yaml b/doc/openapi/components/schemas/config/netem.yaml
new file mode 100644
index 000000000..27f03cf75
--- /dev/null
+++ b/doc/openapi/components/schemas/config/netem.yaml
@@ -0,0 +1,52 @@
+---
+
+type: object
+properties:
+ enabled:
+ type: boolean
+ default: true
+
+ delay:
+ type: number
+ default: 0
+ description: |
+ Delay packets in microseconds.
+
+ jitter:
+ type: number
+ default: 0
+ title: Jitter
+ description: |
+ Apply a jitter to the packet delay (in microseconds).
+
+ distribution:
+ type: string
+ title: Delay distribution
+ description: |
+ One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).
+ enum:
+ - uniform
+ - normal
+ - pareto
+ - paretonormal
+
+ loss:
+ type: number
+ default: 0
+ title: Packet Loss Percentage
+ description: |
+ Percentage of packets which will be dropped.
+
+ duplicate:
+ type: number
+ default: 0
+ title: Packet Duplication Percentage
+ description: |
+ Percentage of packets which will be duplicated.
+
+ corrupt:
+ type: number
+ default: 0
+ title: Packet Corruption Percentage
+ description: |
+ Percentage of packets which will be corrupted.
diff --git a/doc/openapi/components/schemas/config/node.yaml b/doc/openapi/components/schemas/config/node.yaml
new file mode 100644
index 000000000..476c9a1dd
--- /dev/null
+++ b/doc/openapi/components/schemas/config/node.yaml
@@ -0,0 +1,97 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+type: object
+
+title: Node
+
+required:
+- type
+
+properties:
+
+ type:
+ type: string
+ description: |
+ Specifies which protocol should be used by this node.
+
+ For a complete list of supported node-types run `villas node --help`.
+
+ In addition to the node settings described in this section, every node type has its own specific settings
+
+ vectorize:
+ type: integer
+ default: 1
+ description: |
+ This setting allows to send multiple samples in a single message to the destination nodes.
+
+ The value of this setting determines how many samples will be combined into one packet.
+
+ hooks:
+ $ref: hooklist.yaml
+
+ builtin:
+ type: boolean
+ default: true
+ title: Builtin hook functions
+ description: |
+ By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.
+
+ in:
+ type: object
+ properties:
+ vectorize:
+ type: integer
+ minimum: 1
+
+ signals:
+ $ref: signallist.yaml
+
+ hooks:
+ $ref: hooklist.yaml
+
+ out:
+ type: object
+ properties:
+
+ vectorize:
+ type: integer
+
+ hooks:
+ $ref: hooklist.yaml
+
+ netem:
+ $ref: netem.yaml
+
+discriminator:
+ propertyName: type
+ mapping:
+ amqp: nodes/amqp.yaml
+ can: nodes/can.yaml
+ comedi: nodes/comedi.yaml
+ ethercat: nodes/ethercat.yaml
+ exec: nodes/exec.yaml
+ file: nodes/file.yaml
+ fpga: nodes/fpga.yaml
+ iec61850-8-1: nodes/iec61850-8-1.yaml
+ iec61850-9-2: nodes/iec61850-9-2.yaml
+ infiniband: nodes/infiniband.yaml
+ influxdb: nodes/influxdb.yaml
+ kafka: nodes/kafka.yaml
+ loopback: nodes/loopback.yaml
+ mqtt: nodes/mqtt.yaml
+ nanomsg: nodes/nanomsg.yaml
+ ngsi: nodes/ngsi.yaml
+ opal: nodes/opal.yaml
+ redis: nodes/redis.yaml
+ rtp: nodes/rtp.yaml
+ shmem: nodes/shmem.yaml
+ signal.v2: nodes/signal_v2.yaml
+ signal: nodes/signal.yaml
+ socket: nodes/socket.yaml
+ stats: nodes/stats.yaml
+ temper: nodes/temper.yaml
+ test_rtt: nodes/test_rtt.yaml
+ uldaq: nodes/uldaq.yaml
+ websocket: nodes/websocket.yaml
+ zeromq: nodes/zeromq.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/amqp.yaml b/doc/openapi/components/schemas/config/nodes/amqp.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/amqp.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/can.yaml b/doc/openapi/components/schemas/config/nodes/can.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/can.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/comedi.yaml b/doc/openapi/components/schemas/config/nodes/comedi.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/comedi.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/ethercat.yaml b/doc/openapi/components/schemas/config/nodes/ethercat.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/ethercat.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/exec.yaml b/doc/openapi/components/schemas/config/nodes/exec.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/exec.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/file.yaml b/doc/openapi/components/schemas/config/nodes/file.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/file.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/fpga.yaml b/doc/openapi/components/schemas/config/nodes/fpga.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/fpga.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/iec61850-8-1.yaml b/doc/openapi/components/schemas/config/nodes/iec61850-8-1.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/iec61850-8-1.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/iec61850-9-2.yaml b/doc/openapi/components/schemas/config/nodes/iec61850-9-2.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/iec61850-9-2.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/infiniband.yaml b/doc/openapi/components/schemas/config/nodes/infiniband.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/infiniband.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/influxdb.yaml b/doc/openapi/components/schemas/config/nodes/influxdb.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/influxdb.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/kafka.yaml b/doc/openapi/components/schemas/config/nodes/kafka.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/kafka.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/loopback.yaml b/doc/openapi/components/schemas/config/nodes/loopback.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/loopback.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/mqtt.yaml b/doc/openapi/components/schemas/config/nodes/mqtt.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/mqtt.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/nanomsg.yaml b/doc/openapi/components/schemas/config/nodes/nanomsg.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/nanomsg.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/ngsi.yaml b/doc/openapi/components/schemas/config/nodes/ngsi.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/ngsi.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/opal.yaml b/doc/openapi/components/schemas/config/nodes/opal.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/opal.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/redis.yaml b/doc/openapi/components/schemas/config/nodes/redis.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/redis.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/rtp.yaml b/doc/openapi/components/schemas/config/nodes/rtp.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/rtp.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/shmem.yaml b/doc/openapi/components/schemas/config/nodes/shmem.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/shmem.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/signal.yaml b/doc/openapi/components/schemas/config/nodes/signal.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/signal.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/signal_v2.yaml b/doc/openapi/components/schemas/config/nodes/signal_v2.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/signal_v2.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/socket.yaml b/doc/openapi/components/schemas/config/nodes/socket.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/socket.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/stats.yaml b/doc/openapi/components/schemas/config/nodes/stats.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/stats.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/temper.yaml b/doc/openapi/components/schemas/config/nodes/temper.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/temper.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/test_rtt.yaml b/doc/openapi/components/schemas/config/nodes/test_rtt.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/test_rtt.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/uldaq.yaml b/doc/openapi/components/schemas/config/nodes/uldaq.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/uldaq.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/websocket.yaml b/doc/openapi/components/schemas/config/nodes/websocket.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/websocket.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/nodes/zeromq.yaml b/doc/openapi/components/schemas/config/nodes/zeromq.yaml
new file mode 100644
index 000000000..264dcf873
--- /dev/null
+++ b/doc/openapi/components/schemas/config/nodes/zeromq.yaml
@@ -0,0 +1,10 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+
+allOf:
+- $ref: ../node.yaml
+- type: object
+ properties:
+ format:
+ $ref: ../formatspec.yaml
diff --git a/doc/openapi/components/schemas/config/path.yaml b/doc/openapi/components/schemas/config/path.yaml
new file mode 100644
index 000000000..46777202f
--- /dev/null
+++ b/doc/openapi/components/schemas/config/path.yaml
@@ -0,0 +1,89 @@
+---
+# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
+
+type: object
+title: The first anyOf schema
+description: An explanation about the purpose of this instance.
+
+required:
+- in
+
+properties:
+ in:
+ description: |
+ The in settings expects the name of one or more source nodes or mapping expressions.
+
+ oneOf:
+ - type: string
+ - type: array
+ items:
+ type: string
+
+ out:
+ description: |
+ The out setting expects the name of one or more destination nodes. Each sample which is processed by the path will be sent to each of the destination nodes.
+
+ oneOf:
+ - type: string
+ - type: array
+ items:
+ type: string
+
+ enabled:
+ type: boolean
+ default: true
+ description: |
+ The optional enabled setting can be used to temporarily disable a path.
+
+ reverse:
+ type: boolean
+ default: false
+ description: |
+ By default, the path is unidirectional.
+ Meaning, that it only forwards samples from the source to the destination.
+ Sometimes a bidirectional path is needed. This can be accomplished by setting reverse to true.
+
+ mode:
+ type: string
+ default: any
+ enum:
+ - any
+ - all
+ description: |
+ The mode setting specifies under which condition a path is triggered.
+ A triggered path will multiplex / merge samples from its input nodes and run the configured hook functions on them.
+ Afterwards the processed and merged samples will be send to all output nodes.
+
+ Two modes are currently supported:
+
+ - `any``: The path will trigger the path as soon as any of the masked (see `mask`) input nodes received new samples.
+ - `all``: The path will trigger the path as soon as all input nodes received at least one new sample.
+
+ mask:
+ description: |
+ This setting allows masking the the input nodes which can trigger the path.
+
+ See also `mode` setting.
+
+ type: array
+ items:
+ type: string
+ description: A node-name
+
+ rate:
+ type: number
+ minimum: 0
+ default: 0
+ description: |
+ A non-zero value will periodically trigger the path and resend the last sample again.
+
+ A value of zero will disable this feature.
+
+ original_sequence_no:
+ type: boolean
+ default: false
+ description: |
+ When this flag is set, the original sequence number from the source node will be used when multiplexing the nodes.
+
+ hooks:
+ $ref: hooklist.yaml
diff --git a/doc/openapi/components/schemas/config/signaldef.yaml b/doc/openapi/components/schemas/config/signaldef.yaml
new file mode 100644
index 000000000..6c40b800f
--- /dev/null
+++ b/doc/openapi/components/schemas/config/signaldef.yaml
@@ -0,0 +1,54 @@
+---
+type: object
+properties:
+ name:
+ type: string
+ title: Signal name
+ description: |
+ A name which describes the signal.
+ example: Bus123_U
+
+ unit:
+ type: string
+ title: Signal unit
+ description:
+ The unit of the signal.
+ example: V
+
+ type:
+ type: string
+ title: Signal data-type
+ description: |
+ The data-type of the signal.
+ default: float
+ enum:
+ - integer
+ - float
+ - boolean
+ - complex
+
+ init:
+ title: Initial signal value.
+ description: |
+ The initial value of the signal.
+
+ oneOf:
+ - type: integer
+ - type: number
+ - type: boolean
+ - type: object
+ required:
+ - real
+ - imag
+ additionalProperties: false
+ properties:
+ real:
+ type: number
+ imag:
+ type: number
+
+ enabled:
+ type: boolean
+ default: true
+ description: |
+ Signals can be disabled which causes them to be ignored.
diff --git a/doc/openapi/components/schemas/config/signallist.yaml b/doc/openapi/components/schemas/config/signallist.yaml
new file mode 100644
index 000000000..5e42e32f2
--- /dev/null
+++ b/doc/openapi/components/schemas/config/signallist.yaml
@@ -0,0 +1,43 @@
+---
+title: Signal list
+description: |
+ Each node should define a list of signals which it receives.
+
+ There are three ways to specify the input signals of a node:
+
+oneOf:
+- type: array
+ title: List of signal definition objects
+ items:
+ $ref: signaldef.yaml
+
+- type: object
+ title: Signal definition with `count`
+ allOf:
+ - $ref: signaldef.yaml
+ - type: object
+ required:
+ - count
+ properties:
+ count:
+ type: integer
+ minimum: 1
+ default: 64
+
+- type: string
+ title: Signal format string
+ example: '64f'
+ description: |
+ The easiest way to specify the signals, is by using a format string.
+ The format string consists of one ore more characters which define the type for the signal corresponding to the position of the character in the string.
+
+ | Character | Type | Setting for full and list mode |
+ |:--- |:--- |:--- |
+ | `f` | Floating point | "float" |
+ | `b` | Boolean | "boolean" |
+ | `i` | Integer | "integer" |
+ | `c` | Complex Floating point | "complex" |
+
+ Optionally, the characters can be prefixed by an integer for easier repetition.
+
+ **Example:** `12f3i` defines 15 signals, of which the first 12 are floating point and the last 3 are integer values.
diff --git a/doc/schema/format/acs-pmu-edgeflex.yaml b/doc/openapi/components/schemas/formats/edgeflex.yaml
similarity index 63%
rename from doc/schema/format/acs-pmu-edgeflex.yaml
rename to doc/openapi/components/schemas/formats/edgeflex.yaml
index ad43cb8e1..9fdfc7f29 100644
--- a/doc/schema/format/acs-pmu-edgeflex.yaml
+++ b/doc/openapi/components/schemas/formats/edgeflex.yaml
@@ -1,23 +1,23 @@
---
# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
-
-$schema: 'http://json-schema.org/draft-07/schema'
-$id: 'https://villas.fein-aachen.org/formats/edgeflex.json'
title: PMU measurements as used in the EdgeFlex project by Manuel
description: |
- VILLASnode does not support deseralization (yet)
+ VILLASnode does not support deseralization (yet).
type: object
+
required:
- created
+
properties:
created:
+ title: Sampling timestamp
description: A timestamps in miliseconds since 1970-01-01 00:00:00
type: number
- min: 0
+ minimum: 0
-additionalItems:
+additionalProperties:
description: Key-value pairs of measurements
anyOf:
- type: number
@@ -31,12 +31,12 @@ additionalItems:
imag:
type: number
-examples:
-- - signal0: 123.456
- signal1: true
- signal2: 1234
- signal3:
- real: 1234.4556
- imag: 23232.12312
- created: 1633791645123
+example:
+- created: 1633791645123
+ signal0: 123.456
+ signal1: true
+ signal2: 1234
+ signal3:
+ real: 1234.4556
+ imag: 23232.12312
\ No newline at end of file
diff --git a/doc/schema/format/acs-pmu-igor.yaml b/doc/openapi/components/schemas/formats/igor.yaml
similarity index 68%
rename from doc/schema/format/acs-pmu-igor.yaml
rename to doc/openapi/components/schemas/formats/igor.yaml
index 19449f54d..ecb7a9269 100644
--- a/doc/schema/format/acs-pmu-igor.yaml
+++ b/doc/openapi/components/schemas/formats/igor.yaml
@@ -1,13 +1,10 @@
---
# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
-
-$schema: 'http://json-schema.org/draft-07/schema'
-$id: 'https://villas.fein-aachen.org/formats/edgeflex.json'
title: PMU format used by Igor
-examples:
-- device: device1
+example:
+ device: device1
timestamp: '2020-05-20T10:27:57.980802+00:00'
readings:
- channel: BUS1-VA
@@ -70,22 +67,25 @@ properties:
readings:
type: array
items:
- channel:
- type: string
- description: Name of the monitored bus
-
- magnitude:
- type: number
- description: Amplitude of the measured signal [V]
+ type: object
+ properties:
- phase:
- type: number
- description: Phase of the measured signal [radian]
-
- frequency:
- type: number
- description: Frequency of the line signal [Hz]
+ channel:
+ type: string
+ description: Name of the monitored bus
- rocof:
- type: number
- description: Rate of change of frequency [Hz/s]
+ magnitude:
+ type: number
+ description: Amplitude of the measured signal [V]
+
+ phase:
+ type: number
+ description: Phase of the measured signal [radian]
+
+ frequency:
+ type: number
+ description: Frequency of the line signal [Hz]
+
+ rocof:
+ type: number
+ description: Rate of change of frequency [Hz/s]
diff --git a/doc/schema/format/acs-pmu-sogno-old.yaml b/doc/openapi/components/schemas/formats/sogno-old.yaml
similarity index 87%
rename from doc/schema/format/acs-pmu-sogno-old.yaml
rename to doc/openapi/components/schemas/formats/sogno-old.yaml
index 5fe66c9f1..23770931b 100644
--- a/doc/schema/format/acs-pmu-sogno-old.yaml
+++ b/doc/openapi/components/schemas/formats/sogno-old.yaml
@@ -60,10 +60,10 @@ properties:
- apparentpower: single phase power, unit voltampere
- frequency: unit hertz
-examples:
- - device: pmu-abc0
- timestamp: '2021-10-07T10:11:12.1231241+02:00'
- component: 7a30b61a-2913-11ec-9621-0242ac130002
- measurand: voltagemagnitude
- phase: A
- data: 123124
+example:
+ device: pmu-abc0
+ timestamp: '2021-10-07T10:11:12.1231241+02:00'
+ component: 7a30b61a-2913-11ec-9621-0242ac130002
+ measurand: voltagemagnitude
+ phase: A
+ data: 123124
diff --git a/doc/schema/format/acs-pmu-sogno.yaml b/doc/openapi/components/schemas/formats/sogno.yaml
similarity index 92%
rename from doc/schema/format/acs-pmu-sogno.yaml
rename to doc/openapi/components/schemas/formats/sogno.yaml
index 785312407..62dc63fea 100644
--- a/doc/schema/format/acs-pmu-sogno.yaml
+++ b/doc/openapi/components/schemas/formats/sogno.yaml
@@ -1,13 +1,10 @@
---
# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
-
-$schema: 'http://json-schema.org/draft-07/schema'
-$id: 'https://villas.fein-aachen.org/formats/edgeflex.json'
title: PMU format used in SOGNO LF project
-examples:
-- device: device1
+example:
+ device: device1
timestamp: '2020-05-20T10:27:57.980802+00:00'
readings:
- component: BUS1
diff --git a/doc/openapi/openapi.yaml b/doc/openapi/openapi.yaml
new file mode 100644
index 000000000..6616d24a4
--- /dev/null
+++ b/doc/openapi/openapi.yaml
@@ -0,0 +1,146 @@
+---
+openapi: 3.0.3
+
+info:
+ title: VILLASnode API
+ version: 0.10.0
+
+ description: >-
+ A HTTP/REST API for controlling VILLASnode remotely without the need to
+ restart the daemon.
+ termsOfService: 'https://www.fein-aachen.org/projects/villas-node/'
+
+ contact:
+ name: Steffen Vogel
+ email: svogel2@eonerc.rwth-aachen.de
+ url: 'https://fein-aachen.org/contact/'
+
+ license:
+ name: GPL-v3
+ url: 'https://www.gnu.org/licenses/gpl-3.0.en.html'
+
+externalDocs:
+ url: 'https://villas.fein-aachen.org/doc/node.html'
+
+servers:
+- url: 'https://villas.k8s.eonerc.rwth-aachen.de/api/v2'
+ description: The production API server in our EONERC OpenStack Kubernetes
+
+- url: 'http://localhost:8080'
+ description: Your local host
+
+tags:
+- name: super-node
+ x-displayName: Super Node
+ description: Global super-node related operations.
+
+- name: nodes
+ x-displayName: Nodes
+ description: Node related operations.
+
+- name: paths
+ x-displayName: Paths
+ description: Path related operations.
+
+- name: config
+ x-displayName: VILLASnode configuration file
+ description: |
+ This section decribes the schema of the VILLASnode configuration file.
+ Please use the `>` to expand the individual sub-sections.
+
+
+
+- name: format-edgeflex
+ x-displayName: Edgeflex Format
+ description: |
+
+
+- name: format-igor
+ x-displayName: Igor's Format
+ description: |
+
+
+- name: format-sogno
+ x-displayName: SOGNO Format
+ description: |
+
+
+- name: format-sogno-old
+ x-displayName: Old SOGNO Format
+ description: |
+
+
+x-tagGroups:
+- name: VILLASnode APIs
+ tags:
+ - super-node
+ - nodes
+ - paths
+
+- name: Configuration Files
+ tags:
+ - config
+
+- name: Format Schemas
+ tags:
+ - format-edgeflex
+ - format-igor
+ - format-sogno
+ - format-sogno-old
+
+paths:
+ /status:
+ $ref: paths/status.yaml
+ /capabilities:
+ $ref: paths/capabilities.yaml
+ /config:
+ $ref: paths/config.yaml
+ /restart:
+ $ref: paths/restart.yaml
+ /shutdown:
+ $ref: paths/shutdown.yaml
+ /nodes:
+ $ref: paths/nodes.yaml
+ '/node/{uuid-or-name}':
+ $ref: 'paths/node/node@{uuid-or-name}.yaml'
+ '/node/{uuid-or-name}/stats':
+ $ref: 'paths/node/node@{uuid-or-name}@stats.yaml'
+ '/node/{uuid-or-name}/stats/reset':
+ $ref: 'paths/node/node@{uuid-or-name}@stats@reset.yaml'
+ '/node/{uuid-or-name}/start':
+ $ref: 'paths/node/node@{uuid-or-name}@start.yaml'
+ '/node/{uuid-or-name}/stop':
+ $ref: 'paths/node/node@{uuid-or-name}@stop.yaml'
+ '/node/{uuid-or-name}/pause':
+ $ref: 'paths/node/node@{uuid-or-name}@pause.yaml'
+ '/node/{uuid-or-name}/resume':
+ $ref: 'paths/node/node@{uuid-or-name}@resume.yaml'
+ '/node/{uuid-or-name}/restart':
+ $ref: 'paths/node/node@{uuid-or-name}@restart.yaml'
+ '/node/{uuid-or-name}/file/rewind':
+ $ref: 'paths/node/node@{uuid-or-name}@file@rewind.yaml'
+ '/node/{uuid-or-name}/file/seek':
+ $ref: 'paths/node/node@{uuid-or-name}@file@seek.yaml'
+ /paths:
+ $ref: paths/paths.yaml
+ '/path/{uuid}':
+ $ref: 'paths/path/path@{uuid}.yaml'
+ '/path/{uuid}/start':
+ $ref: 'paths/path/path@{uuid}@start.yaml'
+ '/path/{uuid}/stop':
+ $ref: 'paths/path/path@{uuid}@stop.yaml'
+ '/graph.{format}':
+ $ref: 'paths/graph.{format}.yaml'
+
+components:
+ schemas:
+ Config:
+ $ref: components/schemas/config.yaml
+ FormatEdgeflex:
+ $ref: components/schemas/formats/edgeflex.yaml
+ FormatIgor:
+ $ref: components/schemas/formats/igor.yaml
+ FormatSognoOld:
+ $ref: components/schemas/formats/sogno-old.yaml
+ FormatSogno:
+ $ref: components/schemas/formats/sogno.yaml
diff --git a/doc/openapi/paths/README.md b/doc/openapi/paths/README.md
new file mode 100644
index 000000000..04496597e
--- /dev/null
+++ b/doc/openapi/paths/README.md
@@ -0,0 +1,105 @@
+Paths
+=====
+
+Organize your path definitions within this folder. You will reference your paths from your main `openapi.yaml` entrypoint file.
+
+It may help you to adopt some conventions:
+
+* path separator token (e.g. `@`) or subfolders
+* path parameter (e.g. `{example}`)
+* file-per-path or file-per-operation
+
+There are different benefits and drawbacks to each decision.
+
+You can adopt any organization you wish. We have some tips for organizing paths based on common practices.
+
+## Each path in a separate file
+
+Use a predefined "path separator" and keep all of your path files in the top level of the `paths` folder.
+
+```
+# todo: insert tree view of paths folder
+```
+
+Redocly recommends using the `@` character for this case.
+
+In addition, Redocly recommends placing path parameters within `{}` curly braces if you adopt this style.
+
+#### Motivations
+
+* Quickly see a list of all paths. Many people think in terms of the "number" of "endpoints" (paths), and not the "number" of "operations" (paths * http methods).
+
+* Only the "file-per-path" option is semantically correct with the OpenAPI Specification 3.0.2. However, Redocly's openapi-cli will build valid bundles for any of the other options too.
+
+
+#### Drawbacks
+
+* This may require multiple definitions per http method within a single file.
+* It requires settling on a path separator (that is allowed to be used in filenames) and sticking to that convention.
+
+## Each operation in a separate file
+
+You may also place each operation in a separate file.
+
+In this case, if you want all paths at the top-level, you can concatenate the http method to the path name. Similar to the above option, you can
+
+### Files at top-level of `paths`
+
+You may name your files with some concatenation for the http method. For example, following a convention such as: `-.yaml`.
+
+#### Motivations
+
+* Quickly see all operations without needing to navigate subfolders.
+
+#### Drawbacks
+
+* Adopting an unusual path separator convention, instead of using subfolders.
+
+### Use subfolders to mirror API path structure
+
+Example:
+```
+GET /customers
+
+/paths/customers/get.yaml
+```
+
+In this case, the path id defined within subfolders which mirror the API URL structure.
+
+Example with path parameter:
+```
+GET /customers/{id}
+
+/paths/customers/{id}/get.yaml
+```
+
+#### Motivations
+
+It matches the URL structure.
+
+It is pretty easy to reference:
+
+```yaml
+paths:
+ '/customers/{id}':
+ get:
+ $ref: ./paths/customers/{id}/get.yaml
+ put:
+ $ref: ./paths/customers/{id}/put.yaml
+```
+
+#### Drawbacks
+
+If you have a lot of nested folders, it may be confusing to reference your schemas.
+
+Example
+```
+file: /paths/customers/{id}/timeline/{messageId}/get.yaml
+
+# excerpt of file
+ headers:
+ Rate-Limit-Remaining:
+ $ref: ../../../../../components/headers/Rate-Limit-Remaining.yaml
+
+```
+Notice the `../../../../../` in the ref which requires some attention to formulate correctly. While openapi-cli has a linter which suggests possible refs when there is a mistake, this is still a net drawback for APIs with deep paths.
diff --git a/doc/openapi/paths/capabilities.yaml b/doc/openapi/paths/capabilities.yaml
new file mode 100644
index 000000000..e84f4728c
--- /dev/null
+++ b/doc/openapi/paths/capabilities.yaml
@@ -0,0 +1,94 @@
+get:
+ operationId: get-capabilities
+
+ summary: Get the capabilities of the VILLASnode instance.
+ tags:
+ - super-node
+ responses:
+ '200':
+ description: Success
+ content:
+ application/json:
+ examples:
+ example1:
+ value:
+ hooks:
+ - average
+ - average
+ - cast
+ - decimate
+ - dp
+ - drop
+ - dump
+ - ebm
+ - fix
+ - gate
+ - jitter_calc
+ - limit_rate
+ - pps_ts
+ - print
+ - restart
+ - scale
+ - shift_seq
+ - shift_ts
+ - skip_first
+ - stats
+ - ts
+ node-types:
+ - amqp
+ - can
+ - ethercat
+ - example
+ - exec
+ - file
+ - influxdb
+ - kafka
+ - loopback
+ - loopback_internal
+ - mqtt
+ - ngsi
+ - redis
+ - shmem
+ - signal
+ - socket
+ - stats
+ - temper
+ - test_rtt
+ - websocket
+ - zeromq
+ apis:
+ - capabilities
+ - config
+ - node
+ - node/file
+ - node/pause
+ - node/restart
+ - node/resume
+ - node/start
+ - node/stats
+ - node/stats/reset
+ - node/stop
+ - nodes
+ - path
+ - path/start
+ - path/stop
+ - paths
+ - restart
+ - shutdown
+ - status
+ formats:
+ - csv
+ - gtnet
+ - iotagent_ul
+ - json
+ - json.kafka
+ - json.reserve
+ - raw
+ - tsv
+ - value
+ - villas.binary
+ - villas.human
+ - villas.web
+
+ '400':
+ description: Failure
diff --git a/doc/openapi/paths/config.yaml b/doc/openapi/paths/config.yaml
new file mode 100644
index 000000000..3117cb532
--- /dev/null
+++ b/doc/openapi/paths/config.yaml
@@ -0,0 +1,54 @@
+get:
+ operationId: get-config
+
+ summary: Get the currently loaded configuration.
+ tags:
+ - super-node
+ responses:
+ '200':
+ description: Success
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Config'
+ examples:
+ example1:
+ value:
+ nodes:
+ udp_node1:
+ type: socket
+ layer: udp
+ in:
+ address: '*:12000'
+ signals:
+ count: 8
+ type: float
+ out:
+ address: '127.0.0.1:12001'
+ web_node1:
+ type: websocket
+ vectorize: 2
+ series:
+ - label: Random walk
+ unit: V
+ - label: Sine
+ unit: A
+ - label: Rect
+ unit: Var
+ - label: Ramp
+ unit: °C
+ paths:
+ - in:
+ - udp_node1
+ out:
+ - web_node1
+ hooks:
+ - type: decimate
+ ratio: 2
+ - in:
+ - web_node1
+ out:
+ - udp_node1
+
+ '400':
+ description: Failure
diff --git a/doc/openapi/paths/graph.{format}.yaml b/doc/openapi/paths/graph.{format}.yaml
new file mode 100644
index 000000000..e1ea2cf30
--- /dev/null
+++ b/doc/openapi/paths/graph.{format}.yaml
@@ -0,0 +1,53 @@
+get:
+ operationId: get-graph
+
+ summary: Get a graph representation of the currently loaded configuration.
+
+ tags:
+ - super-node
+
+ parameters:
+ - in: path
+ name: format
+ schema:
+ type: string
+ description: The image format of the generated graph.
+ enum:
+ - ps
+ - eps
+ - txt
+ - svg
+ - svgz
+ - gif
+ - png
+ - jpg
+ - jpeg
+ - bmp
+ - dot
+ - fig
+ - json
+ - pdf
+
+ - in: query
+ name: layout
+ schema:
+ type: string
+ description: The Graphviz layout engine used for rendering the graph.
+ enum:
+ - circo
+ - dot
+ - fdp
+ - neato
+ - nop
+ - nop1
+ - nop2
+ - osage
+ - patchwork
+ - sfdp
+ - twopi
+
+ responses:
+ '200':
+ description: Success
+ '400':
+ description: Failure
diff --git a/doc/openapi/paths/node/node@{uuid-or-name}.yaml b/doc/openapi/paths/node/node@{uuid-or-name}.yaml
new file mode 100644
index 000000000..a58c4291e
--- /dev/null
+++ b/doc/openapi/paths/node/node@{uuid-or-name}.yaml
@@ -0,0 +1,33 @@
+get:
+ operationId: get-node
+
+ summary: Get the information of a specific node.
+ tags:
+ - nodes
+ parameters:
+ - $ref: ../../components/parameters/node-uuid-name.yaml
+ responses:
+ '200':
+ description: Success
+ content:
+ application/json:
+ examples:
+ example1:
+ value:
+ name: udp_node1
+ uuid: b3df1d73-f483-f16c-5936-4ea48295615c
+ state: running
+ affinity: -1
+ in:
+ address: '*:12000'
+ signals:
+ count: 8
+ type: float
+ out:
+ address: '127.0.0.1:12001'
+ type: socket
+ layer: udp
+ '404':
+ description: >-
+ Error. There is no node with the given UUID or the node does not collect
+ statistics.
diff --git a/doc/openapi/paths/node/node@{uuid-or-name}@file@rewind.yaml b/doc/openapi/paths/node/node@{uuid-or-name}@file@rewind.yaml
new file mode 100644
index 000000000..76cbaac7f
--- /dev/null
+++ b/doc/openapi/paths/node/node@{uuid-or-name}@file@rewind.yaml
@@ -0,0 +1,13 @@
+post:
+ operationId: rewind-file-node
+
+ summary: Rewind the playback file to the beginning.
+ tags:
+ - nodes
+ parameters:
+ - $ref: ../../components/parameters/node-uuid-name.yaml
+ responses:
+ '200':
+ description: Success. The file has been rewound.
+ '404':
+ description: Error. There is no node with the given UUID.
diff --git a/doc/openapi/paths/node/node@{uuid-or-name}@file@seek.yaml b/doc/openapi/paths/node/node@{uuid-or-name}@file@seek.yaml
new file mode 100644
index 000000000..0fcd76250
--- /dev/null
+++ b/doc/openapi/paths/node/node@{uuid-or-name}@file@seek.yaml
@@ -0,0 +1,27 @@
+post:
+ operationId: seek-file-node
+
+ summary: Rewind the playback file to the beginning.
+ tags:
+ - nodes
+ parameters:
+ - $ref: ../../components/parameters/node-uuid-name.yaml
+ requestBody:
+ description: Sample position in file
+ required: true
+ content:
+ application/json:
+ schema:
+ type: object
+ required:
+ - position
+ properties:
+ position:
+ type: integer
+ example: 123
+ description: Skip the first nth samples in the file.
+ responses:
+ '200':
+ description: Success. The read-pointer of the file has been changed.
+ '404':
+ description: Error. There is no node with the given UUID.
diff --git a/doc/openapi/paths/node/node@{uuid-or-name}@pause.yaml b/doc/openapi/paths/node/node@{uuid-or-name}@pause.yaml
new file mode 100644
index 000000000..0487b1702
--- /dev/null
+++ b/doc/openapi/paths/node/node@{uuid-or-name}@pause.yaml
@@ -0,0 +1,13 @@
+post:
+ operationId: pause-graph
+
+ summary: Pause a node.
+ tags:
+ - nodes
+ parameters:
+ - $ref: ../../components/parameters/node-uuid-name.yaml
+ responses:
+ '200':
+ description: Success. The node has been paused.
+ '404':
+ description: Error. There is no node with the given UUID.
diff --git a/doc/openapi/paths/node/node@{uuid-or-name}@restart.yaml b/doc/openapi/paths/node/node@{uuid-or-name}@restart.yaml
new file mode 100644
index 000000000..175999261
--- /dev/null
+++ b/doc/openapi/paths/node/node@{uuid-or-name}@restart.yaml
@@ -0,0 +1,13 @@
+post:
+ operationId: restart-node
+
+ summary: Retart a node.
+ tags:
+ - nodes
+ parameters:
+ - $ref: ../../components/parameters/node-uuid-name.yaml
+ responses:
+ '200':
+ description: Success. The node has been restarted.
+ '404':
+ description: Error. There is no node with the given UUID.
diff --git a/doc/openapi/paths/node/node@{uuid-or-name}@resume.yaml b/doc/openapi/paths/node/node@{uuid-or-name}@resume.yaml
new file mode 100644
index 000000000..b0f2f0037
--- /dev/null
+++ b/doc/openapi/paths/node/node@{uuid-or-name}@resume.yaml
@@ -0,0 +1,13 @@
+post:
+ operationId: resume-node
+
+ summary: Resume a node.
+ tags:
+ - nodes
+ parameters:
+ - $ref: ../../components/parameters/node-uuid-name.yaml
+ responses:
+ '200':
+ description: Success. The node has been resumed.
+ '404':
+ description: Error. There is no node with the given UUID.
diff --git a/doc/openapi/paths/node/node@{uuid-or-name}@start.yaml b/doc/openapi/paths/node/node@{uuid-or-name}@start.yaml
new file mode 100644
index 000000000..38060a4d7
--- /dev/null
+++ b/doc/openapi/paths/node/node@{uuid-or-name}@start.yaml
@@ -0,0 +1,12 @@
+post:
+ operationId: start-node
+ summary: Start a node.
+ tags:
+ - nodes
+ parameters:
+ - $ref: ../../components/parameters/node-uuid-name.yaml
+ responses:
+ '200':
+ description: Success. The node has been started.
+ '404':
+ description: Error. There is no node with the given UUID.
diff --git a/doc/openapi/paths/node/node@{uuid-or-name}@stats.yaml b/doc/openapi/paths/node/node@{uuid-or-name}@stats.yaml
new file mode 100644
index 000000000..97e805d82
--- /dev/null
+++ b/doc/openapi/paths/node/node@{uuid-or-name}@stats.yaml
@@ -0,0 +1,139 @@
+get:
+ operationId: get-node-stats
+ summary: Get the statistics of a node.
+ tags:
+ - nodes
+ parameters:
+ - $ref: ../../components/parameters/node-uuid-name.yaml
+ responses:
+ '200':
+ description: Success
+ content:
+ application/json:
+ examples:
+ example1:
+ value:
+ rtp.jitter:
+ low: 1.3293196e-316
+ high: 0
+ total: 0
+ rtp.pkts_lost:
+ low: 1.3285797e-316
+ high: 1.3290532e-316
+ total: 0
+ rtp.loss_fraction:
+ low: 3.e-323
+ high: 1.32907453e-316
+ total: 0
+ age:
+ low: 1.3288619e-316
+ high: 1.32909588e-316
+ total: 0
+ owd:
+ low: 3.e-323
+ high: 3.e-322
+ total: 144
+ higher: 0
+ lower: 0
+ highest: 0.099986117
+ lowest: 0.09990915800000001
+ mean: 0.09998063221527778
+ variance: 7.736879555478282e-11
+ stddev: 0.000008795953362472019
+ buckets:
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ gap_received:
+ low: 0
+ high: 1.32743107e-316
+ total: 144
+ higher: 0
+ lower: 0
+ highest: 0.10000411000000001
+ lowest: 0.09999650900000001
+ mean: 0.09999998652777778
+ variance: 5.701784607620545e-13
+ stddev: 7.551016228045431e-7
+ buckets:
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ gap_sent:
+ low: 1.58e-321
+ high: 1.3292848e-316
+ total: 144
+ higher: 0
+ lower: 0
+ highest: 0.10004273400000001
+ lowest: 0.09926839700000001
+ mean: 0.09999436691666665
+ variance: 3.7637473716438304e-9
+ stddev: 0.00006134938770390321
+ buckets:
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ - 0
+ reordered:
+ low: 8.28904606e-315
+ high: 1.32930615e-316
+ total: 0
+ skipped:
+ low: 1.32879865e-316
+ high: 1.3293275e-316
+ total: 0
+ '404':
+ description: >-
+ Error. There is no node with the given UUID or the node does not collect
+ statistics.
diff --git a/doc/openapi/paths/node/node@{uuid-or-name}@stats@reset.yaml b/doc/openapi/paths/node/node@{uuid-or-name}@stats@reset.yaml
new file mode 100644
index 000000000..50f38ccd9
--- /dev/null
+++ b/doc/openapi/paths/node/node@{uuid-or-name}@stats@reset.yaml
@@ -0,0 +1,12 @@
+post:
+ operationId: reset-node-stats
+ summary: Reset the statistics counters for a specific node.
+ tags:
+ - nodes
+ parameters:
+ - $ref: ../../components/parameters/node-uuid-name.yaml
+ responses:
+ '200':
+ description: Success. The statistics of the node have been reset.
+ '404':
+ description: Error. There is no node with the given UUID.
diff --git a/doc/openapi/paths/node/node@{uuid-or-name}@stop.yaml b/doc/openapi/paths/node/node@{uuid-or-name}@stop.yaml
new file mode 100644
index 000000000..370e88534
--- /dev/null
+++ b/doc/openapi/paths/node/node@{uuid-or-name}@stop.yaml
@@ -0,0 +1,12 @@
+post:
+ operationId: stop-node
+ summary: Stop a node.
+ tags:
+ - nodes
+ parameters:
+ - $ref: ../../components/parameters/node-uuid-name.yaml
+ responses:
+ '200':
+ description: Success. The node has been stopped.
+ '404':
+ description: Error. There is no node with the given UUID.
diff --git a/doc/openapi/paths/nodes.yaml b/doc/openapi/paths/nodes.yaml
new file mode 100644
index 000000000..603c1fa40
--- /dev/null
+++ b/doc/openapi/paths/nodes.yaml
@@ -0,0 +1,71 @@
+get:
+ operationId: get-nodes
+ summary: Get a list of all configure node instances.
+ tags:
+ - nodes
+ responses:
+ '200':
+ description: Success
+ content:
+ application/json:
+ examples:
+ example1:
+ value:
+ - name: udp_node1
+ uuid: b3df1d73-f483-f16c-5936-4ea48295615c
+ state: running
+ affinity: -1
+ in:
+ address: '*:12000'
+ signals:
+ count: 8
+ type: float
+ out:
+ address: '127.0.0.1:12001'
+ type: socket
+ layer: udp
+ - name: web_node1
+ uuid: 19c84350-c83a-8a3b-224b-43fa591c8998
+ state: running
+ affinity: -1
+ in:
+ vectorize: 2
+ signals:
+ - type: float
+ enabled: true
+ name: signal0
+ - type: float
+ enabled: true
+ name: signal1
+ - type: float
+ enabled: true
+ name: signal2
+ - type: float
+ enabled: true
+ name: signal3
+ out:
+ vectorize: 2
+ signals:
+ - type: float
+ enabled: true
+ name: signal0
+ - type: float
+ enabled: true
+ name: signal1
+ - type: float
+ enabled: true
+ name: signal2
+ type: websocket
+ vectorize: 2
+ series:
+ - label: Random walk
+ unit: V
+ - label: Sine
+ unit: A
+ - label: Rect
+ unit: Var
+ - label: Ramp
+ unit: °C
+
+ '400':
+ description: Failure
diff --git a/doc/openapi/paths/path/path@{uuid}.yaml b/doc/openapi/paths/path/path@{uuid}.yaml
new file mode 100644
index 000000000..04550259c
--- /dev/null
+++ b/doc/openapi/paths/path/path@{uuid}.yaml
@@ -0,0 +1,33 @@
+post:
+ operationId: get-path
+ summary: Get details of a single path.
+ tags:
+ - paths
+ parameters:
+ - $ref: ../../components/parameters/path-uuid.yaml
+ responses:
+ '200':
+ description: Success
+ content:
+ application/json:
+ examples:
+ example1:
+ value:
+ uuid: 251c99af-4b05-9de4-367e-2bb550412e56
+ state: running
+ mode: any
+ enabled: true
+ builtin: true
+ reverse: false
+ original_sequence_no: true
+ last_sequence: false
+ poll: false
+ queuelen: 1024
+ signals: []
+ hooks: []
+ in:
+ - udp_node1
+ out:
+ - web_node1
+ '404':
+ description: Error. There is no path with the given UUID.
diff --git a/doc/openapi/paths/path/path@{uuid}@start.yaml b/doc/openapi/paths/path/path@{uuid}@start.yaml
new file mode 100644
index 000000000..0807cc36c
--- /dev/null
+++ b/doc/openapi/paths/path/path@{uuid}@start.yaml
@@ -0,0 +1,12 @@
+post:
+ operationId: start-path
+ summary: Start a path.
+ tags:
+ - paths
+ parameters:
+ - $ref: ../../components/parameters/path-uuid.yaml
+ responses:
+ '200':
+ description: Success. The path has been started.
+ '404':
+ description: Error. There is no path with the given UUID.
diff --git a/doc/openapi/paths/path/path@{uuid}@stop.yaml b/doc/openapi/paths/path/path@{uuid}@stop.yaml
new file mode 100644
index 000000000..f63f5e059
--- /dev/null
+++ b/doc/openapi/paths/path/path@{uuid}@stop.yaml
@@ -0,0 +1,12 @@
+post:
+ operationId: stop-path
+ summary: Start a path.
+ tags:
+ - paths
+ parameters:
+ - $ref: ../../components/parameters/path-uuid.yaml
+ responses:
+ '200':
+ description: Success. The path has been stopped.
+ '404':
+ description: Error. There is no path with the given UUID.
diff --git a/doc/openapi/paths/paths.yaml b/doc/openapi/paths/paths.yaml
new file mode 100644
index 000000000..9a023204e
--- /dev/null
+++ b/doc/openapi/paths/paths.yaml
@@ -0,0 +1,48 @@
+get:
+ operationId: get-paths
+ summary: Get a list of all paths.
+ tags:
+ - paths
+ responses:
+ '200':
+ description: Success
+ content:
+ application/json:
+ examples:
+ example1:
+ value:
+ - uuid: 251c99af-4b05-9de4-367e-2bb550412e56
+ state: running
+ mode: any
+ enabled: true
+ builtin: true
+ reverse: false
+ original_sequence_no: true
+ last_sequence: false
+ poll: false
+ queuelen: 1024
+ signals: []
+ hooks: []
+ in:
+ - udp_node1
+ out:
+ - web_node1
+ - uuid: 61b5674b-95fa-b35f-bff8-c877acf21e3b
+ state: running
+ mode: any
+ enabled: true
+ builtin: true
+ reverse: false
+ original_sequence_no: true
+ last_sequence: false
+ poll: false
+ queuelen: 1024
+ signals: []
+ hooks: []
+ in:
+ - web_node1
+ out:
+ - udp_node1
+
+ '400':
+ description: Failure
diff --git a/doc/openapi/paths/restart.yaml b/doc/openapi/paths/restart.yaml
new file mode 100644
index 000000000..008fc992c
--- /dev/null
+++ b/doc/openapi/paths/restart.yaml
@@ -0,0 +1,36 @@
+post:
+ operationId: restart
+ summary: Restart the VILLASnode instance.
+ tags:
+ - super-node
+ requestBody:
+ required: false
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ config:
+ oneOf:
+ - type: string
+ example: 'http://example.com/path/to/config.json'
+ title: URL
+ description: |
+ An optional path or URI to a new configuration file which
+ should be loaded after restarting the node.
+
+ The file referenced by the URL must be a [VILLASnode configuration file](#tag/config)
+ - $ref: '#/components/schemas/Config'
+ responses:
+ '200':
+ description: Success. The instance has been restarted.
+ content:
+ application/json:
+ examples:
+ example1:
+ value:
+ restarts: 5
+ config: 'http://example.com/path/to/config.json'
+
+ '400':
+ description: Failure
diff --git a/doc/openapi/paths/shutdown.yaml b/doc/openapi/paths/shutdown.yaml
new file mode 100644
index 000000000..da170e100
--- /dev/null
+++ b/doc/openapi/paths/shutdown.yaml
@@ -0,0 +1,11 @@
+post:
+ operationId: shutdown
+ summary: Shutdown the VILLASnode instance.
+ tags:
+ - super-node
+ responses:
+ '200':
+ description: Success. The instance has been shut down.
+
+ '400':
+ description: Failure
diff --git a/doc/openapi/paths/status.yaml b/doc/openapi/paths/status.yaml
new file mode 100644
index 000000000..6e431efce
--- /dev/null
+++ b/doc/openapi/paths/status.yaml
@@ -0,0 +1,56 @@
+get:
+ operationId: get-status
+ summary: Get the current status of the VILLASnode instance.
+ tags:
+ - super-node
+ responses:
+ '200':
+ description: Success
+ content:
+ application/json:
+ examples:
+ example1:
+ value:
+ state: running
+ version: v0.10.0
+ release: 1.node_uuid_unique_debug.20201015git335440d
+ build_id: v0.10.0-335440d-debug
+ build_date: '20201015'
+ hostname: ernie
+ uuid: c9d64cc7-c6e1-4dd4-8873-126318e9d42c
+ time_now: 1602765814.9240997
+ time_started: 1602765814.3103526
+ timezone:
+ name: CEST
+ offset: -3600
+ dst: true
+ kernel:
+ sysname: Linux
+ nodename: ernie
+ release: 5.6.17-rt10
+ version: '#5 SMP Fri Jul 10 14:02:33 CEST 2020'
+ machine: x86_64
+ domainname: (none)
+ system:
+ cores_configured: 28
+ cores: 28
+ processes: 780
+ uptime: 1379600
+ load:
+ - 1.66259765625
+ - 1.271484375
+ - 1.18701171875
+ ram:
+ total: 269994606592
+ free: 262204465152
+ shared: 44191744
+ buffer: 130211840
+ swap:
+ total: 4294963200
+ free: 4294963200
+ highmem:
+ total: 0
+ free: 0
+
+ '400':
+ description: Failure
diff --git a/doc/package-lock.json b/doc/package-lock.json
new file mode 100644
index 000000000..615921d18
--- /dev/null
+++ b/doc/package-lock.json
@@ -0,0 +1,1546 @@
+{
+ "name": "villasnode-api",
+ "version": "1.0.0",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "villasnode-api",
+ "version": "1.0.0",
+ "dependencies": {
+ "@redocly/openapi-cli": "^1.0.0-beta.69"
+ }
+ },
+ "node_modules/@redocly/ajv": {
+ "version": "8.6.4",
+ "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.6.4.tgz",
+ "integrity": "sha512-y9qNj0//tZtWB2jfXNK3BX18BSBp9zNR7KE7lMysVHwbZtY392OJCjm6Rb/h4UHH2r1AqjNEHFD6bRn+DqU9Mw==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/@redocly/openapi-cli": {
+ "version": "1.0.0-beta.69",
+ "resolved": "https://registry.npmjs.org/@redocly/openapi-cli/-/openapi-cli-1.0.0-beta.69.tgz",
+ "integrity": "sha512-LVMiIl9A6n1qwwCmfOgl41CO49ULs4baBX5Xmuyi1KiduqIKFi4LWVed2JRe3ACP+QZox+kmfYllrMWvyHZk+Q==",
+ "dependencies": {
+ "@redocly/openapi-core": "^1.0.0-beta.69",
+ "@types/node": "^14.11.8",
+ "assert-node-version": "^1.0.3",
+ "chokidar": "^3.5.1",
+ "colorette": "^1.2.0",
+ "glob": "^7.1.6",
+ "glob-promise": "^3.4.0",
+ "handlebars": "^4.7.6",
+ "portfinder": "^1.0.26",
+ "simple-websocket": "^9.0.0",
+ "yargs": "17.0.1"
+ },
+ "bin": {
+ "openapi": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@redocly/openapi-core": {
+ "version": "1.0.0-beta.69",
+ "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.0.0-beta.69.tgz",
+ "integrity": "sha512-A05sPH8U26qQdZgkOQfHrL8dwY3twJ51/PY43WUuRqMdeZEu3SRcIdgLyXaIgR82ZnHC2Y/MnexE5QKtKObYJA==",
+ "dependencies": {
+ "@redocly/ajv": "^8.6.4",
+ "@types/node": "^14.11.8",
+ "colorette": "^1.2.0",
+ "js-levenshtein": "^1.1.6",
+ "js-yaml": "^4.1.0",
+ "lodash.isequal": "^4.5.0",
+ "minimatch": "^3.0.4",
+ "node-fetch": "^2.6.1",
+ "pluralize": "^8.0.0",
+ "yaml-ast-parser": "0.0.43"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@types/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
+ "dependencies": {
+ "@types/minimatch": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/minimatch": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
+ "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ=="
+ },
+ "node_modules/@types/node": {
+ "version": "14.17.33",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.33.tgz",
+ "integrity": "sha512-noEeJ06zbn3lOh4gqe2v7NMGS33jrulfNqYFDjjEbhpDEHR5VTxgYNQSBqBlJIsBJW3uEYDgD6kvMnrrhGzq8g=="
+ },
+ "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==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "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/assert-node-version": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/assert-node-version/-/assert-node-version-1.0.3.tgz",
+ "integrity": "sha1-yupdG2pY285ZZhII3x4bnkxYD5E=",
+ "dependencies": {
+ "expected-node-version": "^1.0.0",
+ "semver": "^5.0.3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/async": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
+ "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
+ "dependencies": {
+ "lodash": "^4.17.14"
+ }
+ },
+ "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=="
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "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==",
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
+ "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "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/colorette": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
+ "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g=="
+ },
+ "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="
+ },
+ "node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "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=="
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/expected-node-version": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/expected-node-version/-/expected-node-version-1.0.2.tgz",
+ "integrity": "sha1-uNIlub9nap6H4G29YVtS/J0eOGs=",
+ "engines": {
+ "node": ">=0.10.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/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==",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "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"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/glob-promise": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz",
+ "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==",
+ "dependencies": {
+ "@types/glob": "*"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "glob": "*"
+ }
+ },
+ "node_modules/handlebars": {
+ "version": "4.7.7",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
+ "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
+ "dependencies": {
+ "minimist": "^1.2.5",
+ "neo-async": "^2.6.0",
+ "source-map": "^0.6.1",
+ "wordwrap": "^1.0.0"
+ },
+ "bin": {
+ "handlebars": "bin/handlebars"
+ },
+ "engines": {
+ "node": ">=0.4.7"
+ },
+ "optionalDependencies": {
+ "uglify-js": "^3.1.4"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/js-levenshtein": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
+ "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==",
+ "engines": {
+ "node": ">=0.10.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"
+ }
+ },
+ "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/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
+ },
+ "node_modules/minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "dependencies": {
+ "minimist": "^1.2.5"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
+ },
+ "node_modules/node-fetch": {
+ "version": "2.6.6",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz",
+ "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "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=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pluralize": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
+ "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/portfinder": {
+ "version": "1.0.28",
+ "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
+ "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
+ "dependencies": {
+ "async": "^2.6.2",
+ "debug": "^3.1.1",
+ "mkdirp": "^0.5.5"
+ },
+ "engines": {
+ "node": ">= 0.12.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_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "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==",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "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=",
+ "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/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==",
+ "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": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/simple-websocket": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/simple-websocket/-/simple-websocket-9.1.0.tgz",
+ "integrity": "sha512-8MJPnjRN6A8UCp1I+H/dSFyjwJhp6wta4hsVRhjf8w9qBHRzxYt14RaOcjvQnhD1N4yKOddEjflwMnQM4VtXjQ==",
+ "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": {
+ "debug": "^4.3.1",
+ "queue-microtask": "^1.2.2",
+ "randombytes": "^2.1.0",
+ "readable-stream": "^3.6.0",
+ "ws": "^7.4.2"
+ }
+ },
+ "node_modules/simple-websocket/node_modules/debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/simple-websocket/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=="
+ },
+ "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==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
+ },
+ "node_modules/uglify-js": {
+ "version": "3.14.3",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz",
+ "integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==",
+ "optional": true,
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
+ },
+ "engines": {
+ "node": ">=0.8.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"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
+ },
+ "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==",
+ "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"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "node_modules/ws": {
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz",
+ "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": 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==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yaml-ast-parser": {
+ "version": "0.0.43",
+ "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz",
+ "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A=="
+ },
+ "node_modules/yargs": {
+ "version": "17.0.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.0.1.tgz",
+ "integrity": "sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==",
+ "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"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "engines": {
+ "node": ">=10"
+ }
+ }
+ },
+ "dependencies": {
+ "@redocly/ajv": {
+ "version": "8.6.4",
+ "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.6.4.tgz",
+ "integrity": "sha512-y9qNj0//tZtWB2jfXNK3BX18BSBp9zNR7KE7lMysVHwbZtY392OJCjm6Rb/h4UHH2r1AqjNEHFD6bRn+DqU9Mw==",
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "@redocly/openapi-cli": {
+ "version": "1.0.0-beta.69",
+ "resolved": "https://registry.npmjs.org/@redocly/openapi-cli/-/openapi-cli-1.0.0-beta.69.tgz",
+ "integrity": "sha512-LVMiIl9A6n1qwwCmfOgl41CO49ULs4baBX5Xmuyi1KiduqIKFi4LWVed2JRe3ACP+QZox+kmfYllrMWvyHZk+Q==",
+ "requires": {
+ "@redocly/openapi-core": "^1.0.0-beta.69",
+ "@types/node": "^14.11.8",
+ "assert-node-version": "^1.0.3",
+ "chokidar": "^3.5.1",
+ "colorette": "^1.2.0",
+ "glob": "^7.1.6",
+ "glob-promise": "^3.4.0",
+ "handlebars": "^4.7.6",
+ "portfinder": "^1.0.26",
+ "simple-websocket": "^9.0.0",
+ "yargs": "17.0.1"
+ }
+ },
+ "@redocly/openapi-core": {
+ "version": "1.0.0-beta.69",
+ "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.0.0-beta.69.tgz",
+ "integrity": "sha512-A05sPH8U26qQdZgkOQfHrL8dwY3twJ51/PY43WUuRqMdeZEu3SRcIdgLyXaIgR82ZnHC2Y/MnexE5QKtKObYJA==",
+ "requires": {
+ "@redocly/ajv": "^8.6.4",
+ "@types/node": "^14.11.8",
+ "colorette": "^1.2.0",
+ "js-levenshtein": "^1.1.6",
+ "js-yaml": "^4.1.0",
+ "lodash.isequal": "^4.5.0",
+ "minimatch": "^3.0.4",
+ "node-fetch": "^2.6.1",
+ "pluralize": "^8.0.0",
+ "yaml-ast-parser": "0.0.43"
+ }
+ },
+ "@types/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
+ "requires": {
+ "@types/minimatch": "*",
+ "@types/node": "*"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
+ "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ=="
+ },
+ "@types/node": {
+ "version": "14.17.33",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.33.tgz",
+ "integrity": "sha512-noEeJ06zbn3lOh4gqe2v7NMGS33jrulfNqYFDjjEbhpDEHR5VTxgYNQSBqBlJIsBJW3uEYDgD6kvMnrrhGzq8g=="
+ },
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
+ "assert-node-version": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/assert-node-version/-/assert-node-version-1.0.3.tgz",
+ "integrity": "sha1-yupdG2pY285ZZhII3x4bnkxYD5E=",
+ "requires": {
+ "expected-node-version": "^1.0.0",
+ "semver": "^5.0.3"
+ }
+ },
+ "async": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
+ "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
+ "requires": {
+ "lodash": "^4.17.14"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "chokidar": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
+ "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
+ "requires": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.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==",
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.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==",
+ "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=="
+ },
+ "colorette": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
+ "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g=="
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ },
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "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=="
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
+ },
+ "expected-node-version": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/expected-node-version/-/expected-node-version-1.0.2.tgz",
+ "integrity": "sha1-uNIlub9nap6H4G29YVtS/J0eOGs="
+ },
+ "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=="
+ },
+ "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==",
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "optional": 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=="
+ },
+ "glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "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"
+ }
+ },
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "glob-promise": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz",
+ "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==",
+ "requires": {
+ "@types/glob": "*"
+ }
+ },
+ "handlebars": {
+ "version": "4.7.7",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
+ "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
+ "requires": {
+ "minimist": "^1.2.5",
+ "neo-async": "^2.6.0",
+ "source-map": "^0.6.1",
+ "uglify-js": "^3.1.4",
+ "wordwrap": "^1.0.0"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+ },
+ "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=="
+ },
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+ },
+ "js-levenshtein": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
+ "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g=="
+ },
+ "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"
+ }
+ },
+ "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=="
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+ },
+ "mkdirp": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "requires": {
+ "minimist": "^1.2.5"
+ }
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
+ },
+ "node-fetch": {
+ "version": "2.6.6",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz",
+ "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==",
+ "requires": {
+ "whatwg-url": "^5.0.0"
+ }
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "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="
+ },
+ "picomatch": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw=="
+ },
+ "pluralize": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
+ "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="
+ },
+ "portfinder": {
+ "version": "1.0.28",
+ "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
+ "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
+ "requires": {
+ "async": "^2.6.2",
+ "debug": "^3.1.1",
+ "mkdirp": "^0.5.5"
+ }
+ },
+ "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=="
+ },
+ "randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+ },
+ "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=="
+ },
+ "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=="
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ },
+ "simple-websocket": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/simple-websocket/-/simple-websocket-9.1.0.tgz",
+ "integrity": "sha512-8MJPnjRN6A8UCp1I+H/dSFyjwJhp6wta4hsVRhjf8w9qBHRzxYt14RaOcjvQnhD1N4yKOddEjflwMnQM4VtXjQ==",
+ "requires": {
+ "debug": "^4.3.1",
+ "queue-microtask": "^1.2.2",
+ "randombytes": "^2.1.0",
+ "readable-stream": "^3.6.0",
+ "ws": "^7.4.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "requires": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "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==",
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
+ "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==",
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
+ },
+ "uglify-js": {
+ "version": "3.14.3",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz",
+ "integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==",
+ "optional": 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"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
+ },
+ "whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
+ "requires": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
+ },
+ "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==",
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "ws": {
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz",
+ "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==",
+ "requires": {}
+ },
+ "y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
+ },
+ "yaml-ast-parser": {
+ "version": "0.0.43",
+ "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz",
+ "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A=="
+ },
+ "yargs": {
+ "version": "17.0.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.0.1.tgz",
+ "integrity": "sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==",
+ "requires": {
+ "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"
+ }
+ },
+ "yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="
+ }
+ }
+}
diff --git a/doc/package.json b/doc/package.json
new file mode 100644
index 000000000..4bbea679b
--- /dev/null
+++ b/doc/package.json
@@ -0,0 +1,13 @@
+{
+ "name": "villasnode-api",
+ "version": "1.0.0",
+ "dependencies": {
+ "@redocly/openapi-cli": "^1.0.0-beta.69"
+ },
+ "private": true,
+ "scripts": {
+ "start": "openapi preview-docs",
+ "build": "openapi bundle -o dist",
+ "test": "openapi lint"
+ }
+}
diff --git a/doc/schema/config.yaml b/doc/schema/config.yaml
deleted file mode 100644
index ec10f8c41..000000000
--- a/doc/schema/config.yaml
+++ /dev/null
@@ -1,185 +0,0 @@
----
-# yaml-language-server: $schema=http://json-schema.org/draft-07/schema
-
-$schema: 'http://json-schema.org/draft-07/schema'
-$id: 'https://villas.fein-aachen.org/config.json'
-
-type: object
-title: VILLASnode configuration file
-description: Schema of the VILLASnode configuration file.
-default: {}
-required:
-- nodes
-additionalProperties: false
-
-properties:
-
- hugepages:
- type: integer
- title: The hugepages schema
- description: An explanation about the purpose of this instance.
- default: 0
- examples:
- - 0
-
- stats:
- type: number
-
- affinity:
- type: integer
-
- priority:
- type: integer
-
- idle_stop:
- type: boolean
- default: false
-
- uuid:
- type: string
- format: uuid
-
- http:
- type: object
- title: The http schema
- description: An explanation about the purpose of this instance.
- default: {}
- examples:
- - htdocs: /usr/share/villas/node/web
- required:
- - htdocs
- properties:
- htdocs:
- type: string
- title: The htdocs schema
- description: An explanation about the purpose of this instance.
- default: ''
- examples:
- - /usr/share/villas/node/web
- additionalProperties: true
-
- logging:
- type: object
- title: The logging schema
- description: An explanation about the purpose of this instance.
- default: {}
- examples:
- - level: info
- required:
- - level
- properties:
- level:
- type: string
- title: The level schema
- description: An explanation about the purpose of this instance.
- default: ''
- examples:
- - info
- additionalProperties: true
-
- nodes:
- type: object
- title: The nodes schema
- description: An explanation about the purpose of this instance.
- default: {}
- patternProperties:
- '[a-z0-9_-]{2,32}':
- type: object
- title: The node schema
- description: An explanation about the purpose of this instance.
- default: {}
- required:
- - type
- properties:
- type:
- type: string
- title: The type schema
- description: An explanation about the purpose of this instance.
- default: ''
- in:
- type: object
- properties:
- vectorize:
- type: integer
- minimum: 1
- signals:
- oneOf:
- - type: string
- - type: array
- items:
- type: object
- properties:
- name: {}
- unit:
- type: string
- type:
- type: string
- enum:
- - integer
- - float
- - boolean
- - complex
- init:
- oneOf:
- - type: integer
- - type: number
- - type: boolean
- - type: object
- required:
- - real
- - imag
- additionalProperties: false
- properties:
- real:
- type: number
- imag:
- type: number
- enabled:
- type: boolean
- default: true
- - type: object
- additionalProperties: false
- properties:
- count:
- type: integer
- minimum: 1
- type:
- type: string
- enum:
- - integer
- - float
- - boolean
- - complex
- out:
- type: object
- properties:
- vectorize:
- type: integer
- additionalProperties: true
- additionalProperties: false
- paths:
- type: array
- title: The paths schema
- description: An explanation about the purpose of this instance.
- default: []
- additionalItems: false
- items:
- anyOf:
- - type: object
- title: The first anyOf schema
- description: An explanation about the purpose of this instance.
- default: {}
- required:
- - in
- properties:
- in:
- type: string
- title: The in schema
- description: An explanation about the purpose of this instance.
- default: ''
- out:
- type: string
- title: The out schema
- description: An explanation about the purpose of this instance.
- default: ''
- additionalProperties: true